【发布时间】: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 中。