sql - 分组计数
问题描述
我有下表:
NO ACTION_DT REQUEST_TYPE STATUS_CD
3 5/6/2008 11:07:28 PM CREATE APPROVED
3 1/3/2013 10:02:04 AM UPDATE APPROVED
3 4/21/2015 2:20:27 PM UPDATE APPROVED
3 8/1/2017 3:25:01 PM UPDATE PENDING
3 8/2/2017 9:34:16 AM UPDATE APPROVED
3 11/13/2018 4:12:36 PM UPDATE NEW
3 11/15/2018 9:02:07 AM UPDATE APPROVED
3 7/15/2019 9:07:32 AM UPDATE NEW
3 7/15/2019 9:07:32 AM UPDATE PENDING
3 7/16/2019 9:23:43 AM UPDATE NEW
3 7/16/2019 2:31:20 PM UPDATE PENDING
3 7/16/2019 2:35:47 PM UPDATE APPROVED
我的结果:
NO ACTION_DT REQUEST_TYPE STATUS_CD REQUEST_START_DT REQUEST_END_DT REQUEST RNK_GRP_REQUEST
803 5/6/2008 11:07:28 PM CREATE APPROVED 5/6/2008 11:07:28 PM 5/6/2008 11:07:28 PM 1 1
803 1/3/2013 10:02:04 AM UPDATE APPROVED 1/3/2013 10:02:04 AM 1/3/2013 10:02:04 AM 2 1
803 4/21/2015 2:20:27 PM UPDATE APPROVED 4/21/2015 2:20:27 PM 4/21/2015 2:20:27 PM 3 1
803 8/1/2017 3:25:01 PM UPDATE PENDING 8/1/2017 3:25:01 PM 8/2/2017 9:34:16 AM 4 1
803 8/2/2017 9:34:16 AM UPDATE APPROVED 8/1/2017 3:25:01 PM 8/2/2017 9:34:16 AM 4 2
803 11/13/2018 4:12:36 PM UPDATE NEW 11/13/2018 4:12:36 PM 11/15/2018 9:02:07 AM 5 1
803 11/15/2018 9:02:07 AM UPDATE APPROVED 11/13/2018 4:12:36 PM 11/15/2018 9:02:07 AM 5 2
803 7/15/2019 9:07:32 AM UPDATE NEW 7/15/2019 9:07:32 AM 7/16/2019 2:35:47 PM 6 1
803 7/15/2019 9:07:32 AM UPDATE PENDING 7/15/2019 9:07:32 AM 7/16/2019 2:35:47 PM 6 2
803 7/16/2019 9:23:43 AM UPDATE NEW 7/15/2019 9:07:32 AM 7/16/2019 2:35:47 PM 6 3
803 7/16/2019 2:31:20 PM UPDATE PENDING 7/15/2019 9:07:32 AM 7/16/2019 2:35:47 PM 6 4
803 7/16/2019 2:35:47 PM UPDATE APPROVED 7/15/2019 9:07:32 AM 7/16/2019 2:35:47 PM 6 5
我遇到的问题是请求#6。用户并不总是遵循流程,因此在新请求之前没有“已批准”或“拒绝”。因此,数据应显示 7 个请求。最后三行是第 7 个请求。
我如何在我的代码中解释这一点?
我已经or
在我的声明中尝试过,case expression
但我收到了window function not allowed here
;也不确定这是否会给我正确的结果。
SQL:
SELECT
W.NO,
W.ACTION_DT,
W.REQUEST_TYPE,
W.STATUS_CD,
MIN(W.ACTION_DT ) OVER ( PARTITION BY NO, GRP ) AS REQUEST_START_DT,
MAX(ACTION_DT) OVER (PARTITION BY NO,GRP) AS REQUEST_END_DT,
W.GRP AS REQUEST,
RNK_GRP_REQUEST
FROM (
SELECT W.*, ROW_NUMBER() OVER (PARTITION BY NO,GRP ORDER BY ACTION_DT,STATUS_CD) RNK_GRP_REQUEST
FROM ( SELECT
W.NO,
W.ACTION_DT,
W.REQUEST_TYPE,
W.STATUS_CD,
COUNT(CASE WHEN STATUS_CD IN ('APPROVED','DENIED')
--OR (STATUS_CD IN ('NEW') AND LAG(STATUS_CD) OVER (PARTITION BY NO ORDER BY ACTION_DT, STATUS_CD) NOT IN ('APPROVED','DENIED'))
THEN 1 END )
OVER (PARTITION BY NO ORDER BY ACTION_DT)
--+ CASE WHEN STATUS_CD IN ('NEW') AND LAG(STATUS_CD) OVER (PARTITION BY NO ORDER BY ACTION_DT, STATUS_CD) NOT IN ('APPROVED','DENIED') THEN 1 ELSE 0 END
+ CASE WHEN STATUS_CD IN ('APPROVED','DENIED') THEN 0 ELSE 1 END
AS GRP
FROM W
WHERE 1=1
AND W.ACTION_DT IS NOT NULL
)W)W
ORDER BY NO, W.ACTION_DT, REQUEST, RNK_GRP_REQUEST
解决方案
可以使用 aCTE
创建lag
,然后使用您的滞后列case expression
来捕获先前的值。
就像是...
with prev as (select lag(status_cd) over partition by no order by action_dt, status_cd) as prev_status_cd, no, action_dt, W.NO|| TO_CHAR(W.ACTION_DT,'YYYYMMDD') || W.STATUS_CD AS PK
from w
select
COUNT(CASE WHEN STATUS_CD IN ('APPROVED','DENIED')
OR W.STATUS_CD IN ('NEW')AND PREV.PREV_STATUS_CD NOT IN ('APPROVED','DENIED')
THEN 1 END )
OVER (PARTITION BY NO ORDER BY ACTION_DT)
+ CASE WHEN STATUS_CD IN ('APPROVED','DENIED') THEN 0 ELSE 1 END
from w
join prev ON W.NO|| TO_CHAR(W.ACTION_DT,'YYYYMMDD') || W.STATUS_CD = PREV.PK
推荐阅读
- amazon-web-services - AWS 自动扩展中的“运行状况检查宽限期”和“默认冷却时间”如何工作?
- docker - 在 docker-compose 中获取映射值的错误
- c - C语言中如何保证数据类型的一致性?
- ios - 未经许可将 SCNNode 向北旋转以进行位置跟踪
- python - 计算重复值,删除重复并保留计数和其他列
- java - 如何从文本文件中读取/加载此 HashMap?
- php - Foreach 通过 laravel 中的“名称”执行操作静态函数:x
- c++ - 如何修复 Struct Player 对象中的矢量位置,使其与 Main 中的 me.position 一起使用?
- python - 用 BeautifulSoup4 改变 html 的结构
- bash - 如何垂直合并通过grep获得的两个字符串?