涉及Listag的DB2 SQL
我有一个如下的数据集涉及Listag的DB2 SQL,sql,db2,Sql,Db2,我有一个如下的数据集 DEPT_ID EMP_NM STATUS_DATE LEFT_FLAG STATUS_CHANGE 1 ABC 20200131 0 N 1 DEF 20200204 0 N 1 DEF 20200504 0 Y 1 XYZ
DEPT_ID EMP_NM STATUS_DATE LEFT_FLAG STATUS_CHANGE
1 ABC 20200131 0 N
1 DEF 20200204 0 N
1 DEF 20200504 0 Y
1 XYZ 20201210 0 N
1 MNO 20201210 0 N
1 DEF 20201230 1 N
1 XYZ 20201230 0 Y
1 PQR 20210123 0 N
1 ABC 20210228 1 N
1 XYZ 20210228 1 N
DEPT_ID EMP_NM STATUS_DATE
1 ABC 20200131
1 ABC,DEF 20200204
1 ABC,DEF 20200504
1 ABC,DEF,XYZ,MNO 20201210
1 ABC,XYZ,MNO 20201230
1 ABC,XYZ,MNO,PQR 20210123
1 MNO,PQR 20210228
现在我想生成如下所示的输出
DEPT_ID EMP_NM STATUS_DATE LEFT_FLAG STATUS_CHANGE
1 ABC 20200131 0 N
1 DEF 20200204 0 N
1 DEF 20200504 0 Y
1 XYZ 20201210 0 N
1 MNO 20201210 0 N
1 DEF 20201230 1 N
1 XYZ 20201230 0 Y
1 PQR 20210123 0 N
1 ABC 20210228 1 N
1 XYZ 20210228 1 N
DEPT_ID EMP_NM STATUS_DATE
1 ABC 20200131
1 ABC,DEF 20200204
1 ABC,DEF 20200504
1 ABC,DEF,XYZ,MNO 20201210
1 ABC,XYZ,MNO 20201230
1 ABC,XYZ,MNO,PQR 20210123
1 MNO,PQR 20210228
我尝试使用Listag,但无法消除重复项,也无法在LEFT_FLAG=1时删除。如果我理解正确,您每次都需要一份员工列表。状态标志似乎与相关性有关 此版本应在DB2中工作:
select dept_id, status_date, listagg(emp_nm, ',') within group (order by emp_nm)
from (select t.dept_id, t.status_date, t2.status_date as status_date_2, t2.left_flag, t2.emp_nm,
row_number() over (partition by t.status_date, t2.dept_id, t2.emp_nm order by t2.status_date desc) as seqnum
from (select dept_id, status_date
from t
group by dept_id, status_date
) t left join
t t2
on t2.dept_id = t.dept_id and t2.status_date <= t.status_date
) tt2
where seqnum = 1 and left_flag = 0
group by dept_id, status_date;
他是一把小提琴
这个版本没有,因为对于DB2来说,correlation子句嵌套得太深了:
select t.dept_id, t.status_date,
(select listagg(t2.emp_nm, ',') within group (order by t2.emp_nm)
from (select t2.emp_nm,
row_number() over (partition by t2.dept_id, t2.emp_nm order by t2.status_date desc) as seqnum
from t t2
where t2.status_date <= t.status_date and
t2.dept_id = t.dept_id
) t2
where t2.seqnum = 1 and t2.left_flag = 0
) as emps
from t
group by dept_id, status_date;
你的逻辑不是100%清楚。行不是累积的。它在DB2V11.x中支持吗?应该在DB2LUW10.5+中工作。Listag在DB2中没有下划线。它没有找到t2.left_标志。因为它不在t2中,所以它在emps中为所有行提供了相同的值,它仍然没有处理左_标志。对于左_标志,我想删除这些EMP