我有一个交易表,通过关闭上一条记录的结束日期并使用当前系统时间和结束日期打开一个新记录来记录客户状态(A、B、C、D)的变化新记录将被设置为高开放日期。
FactID | 客户 ID | 状态 | 生效日期 | 结束日期 |
---|---|---|---|---|
1 | 1 | A | 20/05/2021 晚上 8:52:29 | 21/05/2021 下午 3:08:22 |
2 | 1 | B | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 |
3 | 1 | C | 24/05/2021 下午 2:47:28 | 24/05/2021 下午 4:15:45 |
4 | 1 | A | 24/05/2021 下午 4:15:45 | 24/05/2021 晚上 8:05:09 |
5 | 1 | D | 24/05/2021 8:05:09 PM | 31/12/9000 |
我正在尝试根据上述交易表在某个时间点(日终报告)构建快照。
报告日期 | 客户 ID | 排爆状态 | A_SDate | A_EDate | B_SDate | B_EDDate | C_SDate | C_EDate | D_SDate | D_EDDate |
---|---|---|---|---|---|---|---|---|---|---|
20/05/2021 11:59:59 PM | 1 | A | 20/05/2021 晚上 8:52:29 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 |
21/05/2021 11:59:59 PM | 1 | B | 20/05/2021 晚上 8:52:29 | 21/05/2021 下午 3:08:22 | 21/05/2021 下午 3:08:22 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 |
22/05/2021 11:59:59 PM | 1 | B | 20/05/2021 晚上 8:52:29 | 21/05/2021 下午 3:08:22 | 21/05/2021 下午 3:08:22 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 |
23/05/2021 晚上 11:59:59 | 1 | B | 20/05/2021 晚上 8:52:29 | 21/05/2021 下午 3:08:22 | 21/05/2021 下午 3:08:22 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 |
24/05/2021 晚上 11:59:59 | 1 | D | 20/05/2021 晚上 8:52:29 | 24/05/2021 8:05:09 PM | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 | 24/05/2021 下午 2:47:28 | 24/05/2021 下午 4:15:45 | 24/05/2021 8:05:09 PM | 31/12/9000 |
25/05/2021 11:59:59 PM | 1 | D | 20/05/2021 晚上 8:52:29 | 24/05/2021 晚上 8:05:09 | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 | 24/05/2021 下午 2:47:28 | 24/05/2021 下午 4:15:45 | 24/05/2021 8:05:09 PM | 31/12/9000 |
在构建快照之前尝试扩展事务表时,我现在卡住了。任何指针将不胜感激。
WITH
date_ranges
AS
(SELECT ROWNUM,TO_DATE ('21-05-2021','dd-mm-yyyy') + ROWNUM - 1.00001 reportdate
FROM all_objects
WHERE ROWNUM <= 6),transactions (factid,cust_id,status,effectivedate,enddate)
AS
(SELECT 1,1,'A',TO_DATE ('20/05/2021 8:52:29 PM','DD/MM/YYYY HH12:MI:SS AM'),TO_DATE ('21/05/2021 3:08:22 PM','DD/MM/YYYY HH12:MI:SS AM') FROM DUAL
UNION ALL
SELECT 2,'B',TO_DATE ('24/05/2021 2:47:28 PM','DD/MM/YYYY HH12:MI:SS AM') FROM DUAL
UNION ALL
SELECT 3,'C',TO_DATE ('24/05/2021 4:15:45 PM','DD/MM/YYYY HH12:MI:SS AM') FROM DUAL
UNION ALL
SELECT 4,TO_DATE ('24/05/2021 8:05:09 PM','DD/MM/YYYY HH12:MI:SS AM') FROM DUAL
UNION ALL
SELECT 5,'D',TO_DATE ('31/12/9000','DD/MM/YYYY') FROM DUAL),dataset
AS
(SELECT DISTINCT reportdate,status AS eodstatus,enddate
FROM transactions CROSS JOIN date_ranges)
SELECT reportdate,eodstatus,enddate,CASE
WHEN eodstatus = 'A' THEN MIN (effectivedate)
ELSE TO_DATE ('31/12/9000','DD/MM/YYYY')
END AS a_sdate,CASE WHEN eodstatus = 'A' THEN MAX (enddate) ELSE TO_DATE ('31/12/9000','DD/MM/YYYY')
END AS a_edate,CASE
WHEN eodstatus = 'B' THEN MIN (effectivedate)
ELSE TO_DATE ('31/12/9000','DD/MM/YYYY')
END AS b_sdate,CASE WHEN eodstatus = 'B' THEN MAX (enddate) ELSE TO_DATE ('31/12/9000','DD/MM/YYYY')
END AS b_edate,CASE
WHEN eodstatus = 'C' THEN MIN (effectivedate)
ELSE TO_DATE ('31/12/9000','DD/MM/YYYY')
END AS c_sdate,CASE WHEN eodstatus = 'C' THEN MAX (enddate) ELSE TO_DATE ('31/12/9000','DD/MM/YYYY')
END AS c_edate,CASE
WHEN eodstatus = 'D' THEN MIN (effectivedate)
ELSE TO_DATE ('31/12/9000','DD/MM/YYYY')
END AS d_sdate,CASE WHEN eodstatus = 'D' THEN MAX (enddate) ELSE TO_DATE ('31/12/9000','DD/MM/YYYY')
END AS d_edate
FROM dataset t
WHERE reportdate BETWEEN effectivedate AND enddate
GROUP BY reportdate,enddate
ORDER BY reportdate,eodstatus;
报告日期 | CUST_ID | EODSTATUS | 生效日期 | ENDDATE | A_SDATE | A_EDATE | B_SDATE | B_EDATE | C_SDATE | C_EDATE | D_SDATE | D_EDATE |
---|---|---|---|---|---|---|---|---|---|---|---|---|
20/05/2021 11:59:59 PM | 1 | “A” | 20/05/2021 晚上 8:52:29 | 21/05/2021 下午 3:08:22 | 20/05/2021 晚上 8:52:29 | 21/05/2021 下午 3:08:22 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 |
21/05/2021 11:59:59 PM | 1 | “B” | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 | 31/12/9000 | 31/12/9000 | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 |
22/05/2021 11:59:59 PM | 1 | “B” | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 | 31/12/9000 | 31/12/9000 | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 |
23/05/2021 晚上 11:59:59 | 1 | “B” | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 | 31/12/9000 | 31/12/9000 | 21/05/2021 下午 3:08:22 | 24/05/2021 下午 2:47:28 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 |
24/05/2021 晚上 11:59:59 | 1 | “D” | 24/05/2021 8:05:09 PM | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 24/05/2021 晚上 8:05:09 | 31/12/9000 |
25/05/2021 11:59:59 PM | 1 | “D” | 24/05/2021 晚上 8:05:09 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 31/12/9000 | 24/05/2021 8:05:09 PM | 31/12/9000 |
SQLFiddle here
PS:我看了另一个thread in SO,它的标题几乎相同,但没有太大帮助。
更新 1:
我现在能够获得所有报告日期的每日状态,但开始和结束日期的计算以及将值转移到后续行仍然没有发生(因为我还没有弄清楚)。
>- 开始日期 - MIN(给定状态的生效日期)
- 结束日期 - MAX(给定状态的结束日期)
更新 2: 计算的开始日期和结束日期不得晚于报告日期。请参阅展示当前问题的 SQL 输出