【问题标题】:lead keep and case铅保持和案例
【发布时间】:2019-07-23 12:28:17
【问题描述】:

*编辑

我有下表:

表W

No    action_dt              type    status
1      5/6/2008 10:55:11 PM  CREATE  APPROVED
1      1/3/2013 9:52:01 AM   UPDATE  APPROVED
1      1/3/2013 9:57:26 AM   UPDATE  APPROVED
1      4/21/2015 2:19:04 PM  UPDATE  APPROVED
1    10/27/2016 10:40:19 AM  UPDATE  APPROVED
1    2/19/2018 4:18:18 PM    UPDATE  APPROVED
1    11/13/2018 4:13:38 PM   UPDATE  NEW
1    11/15/2018 9:44:55 AM   UPDATE  APPROVED
1    7/17/2019 2:21:52 PM    UPDATE  PENDING
1    7/17/2019 2:21:52 PM    UPDATE  NEW
1   7/17/2019 2:47:31 PM     UPDATE  APPROVED

预期结果:

No  Action_dt              type     status   start_dt               End_dt
1   5/6/2008 10:55:11 PM   CREATE   APPROVED 5/6/2008 10:55:11 PM   5/6/2008 10:55:11 PM
1   1/3/2013 9:52:01 AM    UPDATE   APPROVED 1/3/2013 9:52:01 AM    1/3/2013 9:52:01 AM
1   1/3/2013 9:57:26 AM    UPDATE   APPROVED 1/3/2013 9:57:26 AM    1/3/2013 9:57:26 AM
1   4/21/2015 2:19:04 PM   UPDATE   APPROVED 4/21/2015 2:19:04 PM   4/21/2015 2:19:04 PM
1   10/27/2016 10:40:19 AM UPDATE   APPROVED 10/27/2016 10:40:19 AM 10/27/2016 10:40:19 AM
1   2/19/2018 4:18:18 PM   UPDATE   APPROVED 2/19/2018 4:18:18 PM   2/19/2018 4:18:18 PM
1   11/13/2018 4:13:38 PM   UPDATE  NEW      11/13/2018 4:13:38 PM  
1   11/15/2018 9:44:55 AM   UPDATE  APPROVED 11/15/2018 9:44:55 AM  11/15/2018 9:44:55 AM
1   7/17/2019 2:21:52 PM    UPDATE  PENDING     
1   7/17/2019 2:21:52 PM    UPDATE  NEW      7/17/2019 2:21:52 PM   
1   7/17/2019 2:47:31 PM    UPDATE  APPROVED 7/17/2019 2:47:31 PM   7/17/2019 2:47:31 PM

现在我需要填写缺少的 start_dt 和 end_dt

第 9 行更新待定为 NULL 当请求类型 = 创建或更新且状态 = 新时,我需要取上面的第一行

end_dt 第 7、9、10 行

当请求类型 = 创建或更新且状态代码 = 已批准时,取以下第一个日期。

如何做到这一点?也许在 case 表达式中使用 Lead/Lag 和 Keep?

对于缺失的数据。预期输出将是(将其添加到上述预期结果中)

       Start_dt                   End_dt
row 7                             11/15/2018 9:44:55 AM
row 9  11/13/2018 4:13:38 PM       7/17/2019 2:47:31 PM
row 10                            7/17/2019 2:47:31 PM

SQL:

select *
,CASE
--WHEN W.REQUEST_TYPE IN ('CREATE','UPDATE') AND W.STATUS_CD IN ('APPROVED','DENIED') THEN W.ACTION_DT
WHEN W.REQUEST_TYPE IN ('CREATE','UPDATE') AND W.STATUS_CD IN ('NEW','APPROVED')  THEN W.ACTION_DT
--WHEN W.REQUEST_TYPE IN ('CREATE','UPDATE') AND W.STATUS_CD IN ('PENDING')  THEN W.ACTION_DT
ELSE NULL
END REQUEST_START_DT

,CASE
WHEN W.REQUEST_TYPE IN ('CREATE','UPDATE') AND W.STATUS_CD IN ('APPROVED','DENIED') THEN W.ACTION_DT
--WHEN W.REQUEST_TYPE IN ('CREATE','UPDATE') AND W.STATUS_CD IN ('PENDING') THEN LEAD((W.ACTION_DT) KEEP (DENSE_RANK ORDER BY W.STATUS_CD) OVER (PARTITION BY ORG_NO) end)
ELSE NULL
END REQUEST_END_DT
FROM APEXIM.CRD_ORG_WORK W
WHERE 1=1
AND W.NO = 1
from W

【问题讨论】:

  • 这里似乎没有问题。请编辑并更改它,以便您提出问题。你需要什么帮助? (您收到错误了吗?它不是按照您想要/期望的方式工作吗?还有其他问题吗?)
  • @Boneist 问题已更新。
  • 您的预期输出是什么?第 7、9 和 10 行应该有哪些日期?
  • @MT0 添加了额外的预期输出结果表。对于第 7,9 和 10 行
  • 我想我会在我的情况下使用领先/滞后,但会出现错误。这是在我发布的 sql 中。

标签: sql oracle case lead


【解决方案1】:

使用LAG( CASE WHEN <your matches> THEN action_dt END )(或LEAD)和IGNORE NULLS 选项来跳过与CASE 语句不匹配的行。

Oracle 设置

CREATE TABLE w ( no, action_dt, request_type, status ) AS
SELECT 1, DATE '2008-05-06' + INTERVAL '22:55:11' HOUR TO SECOND, 'CREATE', 'APPROVED' FROM DUAL UNION ALL
SELECT 1, DATE '2013-01-03' + INTERVAL '09:52:01' HOUR TO SECOND, 'UPDATE', 'APPROVED' FROM DUAL UNION ALL
SELECT 1, DATE '2013-01-03' + INTERVAL '09:57:26' HOUR TO SECOND, 'UPDATE', 'APPROVED' FROM DUAL UNION ALL
SELECT 1, DATE '2015-04-21' + INTERVAL '14:19:04' HOUR TO SECOND, 'UPDATE', 'APPROVED' FROM DUAL UNION ALL
SELECT 1, DATE '2016-10-27' + INTERVAL '10:40:19' HOUR TO SECOND, 'UPDATE', 'APPROVED' FROM DUAL UNION ALL
SELECT 1, DATE '2018-02-19' + INTERVAL '16:18:18' HOUR TO SECOND, 'UPDATE', 'APPROVED' FROM DUAL UNION ALL
SELECT 1, DATE '2018-11-13' + INTERVAL '16:13:38' HOUR TO SECOND, 'UPDATE', 'NEW'      FROM DUAL UNION ALL
SELECT 1, DATE '2018-11-15' + INTERVAL '09:44:55' HOUR TO SECOND, 'UPDATE', 'APPROVED' FROM DUAL UNION ALL
SELECT 1, DATE '2019-07-17' + INTERVAL '14:21:52' HOUR TO SECOND, 'UPDATE', 'PENDING'  FROM DUAL UNION ALL
SELECT 1, DATE '2019-07-17' + INTERVAL '14:21:52' HOUR TO SECOND, 'UPDATE', 'NEW'      FROM DUAL UNION ALL
SELECT 1, DATE '2019-07-17' + INTERVAL '14:47:31' HOUR TO SECOND, 'UPDATE', 'APPROVED' FROM DUAL

查询

SELECT w.*,
       CASE
       WHEN request_type IN ( 'CREATE', 'UPDATE' ) AND status IN ( 'NEW', 'APPROVED' )
       THEN action_dt
       WHEN request_type IN ( 'CREATE', 'UPDATE' ) AND status = 'PENDING'
       THEN LAG( CASE WHEN request_type IN ( 'CREATE', 'UPDATE' ) AND status = 'NEW' THEN action_dt END )
              IGNORE NULLS OVER ( PARTITION BY no ORDER BY action_dt )
       ELSE NULL
       END AS start_dt,
       CASE
       WHEN request_type IN ( 'CREATE', 'UPDATE' ) AND status IN ( 'NEW', 'APPROVED' )
       THEN action_dt
       WHEN request_type IN ( 'CREATE', 'UPDATE' ) AND status = 'PENDING'
       THEN LEAD( CASE WHEN request_type IN ( 'CREATE', 'UPDATE' ) AND status = 'APPROVED' THEN action_dt END )
              IGNORE NULLS OVER ( PARTITION BY no ORDER BY action_dt )
       ELSE NULL
       END AS end_dt
FROM   w

输出

否 | ACTION_DT |请求类型 |状态 | START_DT | END_DT -: | :----------------- | :----------- | :------- | :----------------- | :----------------- 1 | 2008-05-06 22:55:11 |创建 |批准 | 2008-05-06 22:55:11 | 2008-05-06 22:55:11 1 | 2013-01-03 09:52:01 |更新 |批准 | 2013-01-03 09:52:01 | 2013-01-03 09:52:01 1 | 2013-01-03 09:57:26 |更新 |批准 | 2013-01-03 09:57:26 | 2013-01-03 09:57:26 1 | 2015-04-21 14:19:04 |更新 |批准 | 2015-04-21 14:19:04 | 2015-04-21 14:19:04 1 | 2016-10-27 10:40:19 |更新 |批准 | 2016-10-27 10:40:19 | 2016-10-27 10:40:19 1 | 2018-02-19 16:18:18 |更新 |批准 | 2018-02-19 16:18:18 | 2018-02-19 16:18:18 1 | 2018-11-13 16:13:38 |更新 |新 | 2018-11-13 16:13:38 | 2018-11-13 16:13:38 1 | 2018-11-15 09:44:55 |更新 |批准 | 2018-11-15 09:44:55 | 2018-11-15 09:44:55 1 | 2019-07-17 14:21:52 |更新 |待定 | 2018-11-13 16:13:38 | 2019-07-17 14:47:31 1 | 2019-07-17 14:21:52 |更新 |新 | 2019-07-17 14:21:52 | 2019-07-17 14:21:52 1 | 2019-07-17 14:47:31 |更新 |批准 | 2019-07-17 14:47:31 | 2019-07-17 14:47:31

db小提琴here

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多