合并开始日期和结束日期周期日期

时间:2020-02-12 18:20:44

标签: sql oracle listagg lead

我有下表。

CUST_ID START_CYCLE END_CYCLE   WORKER  CUST_SUB_ID CUST_SUB_TYPE
101     1/1/2019    1/31/2019   ABC123  134         HIGH_SUB
101     2/1/2019    4/30/2019   ABC123  136         HIGH_SUB
101     5/1/2019    7/31/2019   ABC123  1414        HIGH_SUB
101     8/1/2019    8/30/2019   ABC123  1469        HIGH_SUB

发生以下情况时,我需要合并日期(不包括行)。

条件:

lead cust_sub_id <> cust_sub_id

lead cust_sub_type = cust_sub_type

lead cust_id = cust_id

lead工人=工人

最终输出:

CUST_ID START_CYCLE END_CYCLE   WORKER  CUST_SUB_ID         CUST_SUB_TYPE
 101    1/1/2019    8/30/2019   ABC123  134:136:1414:1469   HIGH_SUB

SQL:

select 
cust_id,
start_cycle,
end_cycle,
worker,
cust_sub_id,
cust_sub_type,
gaps_in_srv,
case
when gaps_in_srv = 'N'
and cust_sub_id <> lead(cust_sub_id) over (partition by cust_id order by start_cycle) 
and cust_id = lead(cust_id) over (partition by cust_id order by start_cycle)
and worker = lead(worker) over (partition by cust_id order by start_cycle)
then 'Y'
else 'N'
end merge_dts,
dense_rank() over (partition by cust_id, cust_sub_id order by start_cycle) rnk_fst_dt,
dense_rank() over (partition by cust_id, cust_sub_id order by start_cycle desc) rnk_lst_dt
from cust_cycle

删除行后,我可以使用listagg来捕获cust_sub_id,但是在应用listagg函数之前,需要帮助删除这些行。

1 个答案:

答案 0 :(得分:1)

您可以使用def takeShot(): root.withdraw() sc = ImageGrab.grab() root.deiconify() path = filedialog.asksaveasfilename(defaultextension='.png') sc.save(path) 来确定“岛屿”的起点,并通过累积总和为该岛分配分组编号来解决此问题:

lag()
相关问题