查找相同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