DB2学习笔记

查找相同id数大于1的数据删除

Delete from 表格 where id in (select id from people group by id having count(id)>1);

添加字段

ALTER TABLE "DHGL"."IR_DH_TASK_CUSTINFO"
    ADD COLUMN "IS_SCREEN" INTEGER DEFAULT 0
GO
ALTER TABLE "DHGL"."IR_DH_TASK_CUSTINFO"
    Drop COLUMN "IS_SCREEN" INTEGER
GO

ROW_NUMBER() OVER()函数用法详解

语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
不设置partition by 则对全部数据进行排序,设置了则基于分组列对其他字段进行排序:如图:
在这里插入图片描述在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。

取余数:MOD(A,2)

-> DECODE(MOD(A,2),0,2,1) 结果为2则A为偶数,若结果为1则A为奇数

列转行

给出下面数据

CREATE TABLE SalesAgg
(  year INTEGER,
   q1 INTEGER,
   q2 INTEGER,
   q3 INTEGER,
   q4 INTEGER 
);
YEAR        Q1          Q2          Q3          Q4
----------- ----------- ----------- ----------- -----------
2004          20          30          15          10
2005          18          40          12          27

想要的结果

YEAR        QUARTER     RESULTS
----------- ----------- -----------
2004           1          20
2004           2          30
2004           3          15
2004           4          10
2005           1          18
2005           2          40
2005           3          12
2005           4          27

这个SQL就可以实现:

SELECT S.Year, Q.Quarter, Q.Results
FROM SalesAgg AS S,
     TABLE (VALUES(1, S.q1),
                  (2, S.q2),
                  (3, S.q3),
                  (4, S.q4))
            AS Q(Quarter, Results);

每个values中对应列的数据类型必须相同,值可以任意,如1,2,3,4都是整形

DB2时间函数大全_时间加减

时间加减:后边记得跟上时间类型如day、HOUR

TIMESTAMP ( TIMESTAMP(DEF_TIME)+1 day)+18 HOUR
--获取当前日期: 
select current date from sysibm.sysdummy1;  
values current date; 
 
--获取当前日期  
select current time from sysibm.sysdummy1;  
values current time;  
--获取当前时间戳  
select current timestamp from sysibm.sysdummy1;  
values current timestamp;  
 
--要使当前时间或当前时间戳记调整到GMT/CUT,则把当前的时间或时间戳记减去当前时区寄存器: 
 
values current time -current timezone;  
values current timestamp -current timezone;  
 
--获取当前年份 
 
values year(current timestamp); 
 
--获取当前月  
values month(current timestamp); 
 
--获取当前日  
values day(current timestamp); 
 
--获取当前时  
values hour(current timestamp); 
 
--获取分钟  
values minute(current timestamp); 
 
--获取秒  
values second(current timestamp); 
 
--获取毫秒  
values microsecond(current timestamp);  
 
--从时间戳记单独抽取出日期和时间 
 
values date(current timestamp);  
values VARCHAR_FORMAT(current TIMESTAMP,'yyyy-mm-dd');  
values char(current date);  
values time(current timestamp);  
 
--执行日期和时间的计算 
 
values current date+1 year;     
values current date+3 years+2 months +15 days;  
values current time +5 hours -3 minutes +10 seconds;  
 
--计算两个日期之间的天数 
 
values days(current date)- days(date('2010-02-20'));  
 
--时间和日期换成字符串 
 
values char(current date);  
values char(current time);  
 
--要将字符串转换成日期或时间值 
 
values timestamp('2010-03-09-22.43.00.000000');  
values timestamp('2010-03-09 22:44:36');  
values date('2010-03-09');  
values date('03/09/2010');  
values time('22:45:27');  
values time('22.45.27');  
 
--计算两个时间戳记之间的时差: 
 
--秒的小数部分为单位  
values timestampdiff(1,char(current timestamp - timestamp('2010-01-01-00.00.00')));  
--秒为单位  
values timestampdiff(2,char(current timestamp - timestamp('2010-01-01-00.00.00')));  
--分为单位  
values timestampdiff(4,char(current timestamp - timestamp('2010-01-01-00.00.00')));  
--小时为单位  
values timestampdiff(8,char(current timestamp - timestamp('2010-01-01-00.00.00')));  
--天为单位  
values timestampdiff(16,char(current timestamp - timestamp('2010-01-01-00.00.00')));  
--周为单位  
values timestampdiff(32,char(current timestamp - timestamp('2010-01-01-00.00.00')));  
--月为单位  
values timestampdiff(64,char(current timestamp - timestamp('2010-01-01-00.00.00')));  
--季度为单位  
values timestampdiff(128,char(current timestamp - timestamp('2010-01-01-00.00.00')));  
--年为单位  
values timestampdiff(256,char(current timestamp - timestamp('2010-01-01-00.00.00')));  

数据库主键自增长冲突问题:

原因:手动插入的数据中直接插入了ID,导致数据库自增的值已经存在
解决版办法:重新设置自增计数,从当前主键的最大值加1开始

--查询结果为697015
select max(ID) from WGHYX.CUST_BASEINFO   
alter table  WGHYX.CUST_BASEINFO alter ID restart with 697016

db2数据类型转换:

字段为Integer        Integer ----> char            char(字段)
                    char -------> Integer        Integer(trim(char(字段)))
                    
字段为double(8,2)     double ----->char            char(cast(字段 as decimal(8,2)))
                    char ------->double            cast(cast(char(cast(a.字段 as decimal(8,2))) as decimal(8,2)) as double)
                    
字段为decimal(8,2)    decimal ------->char        Digits(字段)
                    char ------->decimal        cast(Digits(字段) as decimal(8,2))
                    
字段为date            date ------>char            char(字段)
                    char ------>date            date(trim(char(字段)))
                    
字段为bigint        bigint ---->char            char(字段)
                    char ----->bigint            cast(char(字段) as bigint)

分组过滤

语句示例:

SELECT count(*) FROM `order` GROUP BY userId HAVING count(*) > 1;

DB2表解锁语句

CALL SYSPROC.ADMIN_CMD('REORG TABLE 表名')

DB2多行转一行(行转列)

SELECT replace(replace(replace(xml2clob(xmlagg(xmlelement(name A, 【字段】))),'</A><A>', '【分隔符】'),'</A>',''),'<A>','') 
from 【表】
group by 【分组字段】

获取索引下一个值(可用于获取数据表的ID)

【表名】.MESSAGE_ID_SEQUENCE.nextval

报错:No Dialect mapping for JDBC type: 1111

原因:sql获取到得字段类型无法封装
解决方法:分段测试字段,找到无法封装的字段后调整类型。

DB2 修改列属性、设置默认值

1.更改类型(设置为主键的列不能更改类型)  
ALTER TABLE "SCHEMA"."TABLENAME" ALTER COLUMN "COL" SET DATA TYPE VARCHAR(32);  
2.更改默认值  
ALTER TABLE "SCHEMA"."TABLENAME" ALTER COLUMN "COL" SET DEFAULT 'ABC';  
系统默认值:  
--设置默认值  
ALTER TABLE "SCHEMA"."TABLENAME" ALTER COLUMN "COL" SET DEFAULT; 
--删除默认值  
ALTER TABLE "SCHEMA"."TABLENAME" ALTER COLUMN "COL" DROP DEFAULT; 
3.更改是否允许空值  
ALTER TABLE "SCHEMA"."TABLENAME" ALTER COLUMN "COL" SET NOT NULL;  
ALTER TABLE "SCHEMA"."TABLENAME" ALTER COLUMN "COL" DROP NOT NULL;  
更改列类型、是否允许空值后,需要执行
REORG TABLE "TABLENAME";  
更改默认值后,通常需要执行
UPDATE "SCHEMA"."TABLENAME" SET "COL" = DEFAULT WHERE "COL" IS NULL;  

DB2获取当前月天数

select day(LAST_DAY(sysdate) - (LAST_DAY(sysdate - 1 months) + 1 day) )+1 FROM  sysibm.sysdummy1

DB2获取一段时间的日期列表

select * from
( select date('2019-08-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < current date

添加索引后重构

CALL SYSPROC.ADMIN_CMD('REORG TABLE tablename')

无日志清空表

ALTER TABLE tablename ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE

DB2查询正在执行的语句

SELECT * FROM TABLE(SYSPROC.WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES(NULL, -2)) A,
TABLE(MON_GET_ACTIVITY_DETAILS(A.APPLICATION_HANDLE, A.UOW_ID,A.ACTIVITY_ID, -2)) B,
XMLTABLE (XMLNAMESPACES( DEFAULT 'http://www.ibm.com/xmlns/prod/db2/mon'), 
 '$actmetrics/db2_activity_details' 
 PASSING XMLPARSE(DOCUMENT B.DETAILS) AS "actmetrics" 
 COLUMNS "STMT_TEXT" CLOB(2M) PATH 'stmt_text', 
 "STMT_EXEC_TIME" bigint PATH 'stmt_exec_time', 
 "TOTAL_CPU_TIME" bigint PATH 'activity_metrics/total_cpu_time', 
 "TOTAL_ACT_TIME" bigint PATH 'activity_metrics/total_act_time', 
 "TOTAL_ACT_WAIT_TIME" bigint PATH 'activity_metrics/total_act_wait_time') AS C
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值