这个其实是之前那个连续N次数字题的小拓展。用在连续签到天数的开始结束区间和天数,也可以用在连续达标、连续正常考勤、连续超出预警天数等场景。
这是一张交易日历表,我现在为了转换成各个区间,先把连续的日期给区分出来,用上次文章说的ROWNUM-ROW_NUMBER()
来计算
SELECT T.CAL_DAY,
T.FLAG,
ROWNUM AS RN,
ROW_NUMBER() OVER(PARTITION BY T.FLAG ORDER BY T.CAL_DAY) AS SN,
ROWNUM - ROW_NUMBER() OVER(PARTITION BY T.FLAG ORDER BY T.CAL_DAY) AS QJ
FROM TEST_GROUP T
ORDER BY T.CAL_DAY
这里FLAG、QJ
相同的值表示为同一个连续区间。如果只是QJ
相同是不足够判断的,比如下图:
接下来我们只需要对QJ
字段进行GROUP BY
分组聚合即可
SELECT MIN(T.CAL_DAY) AS BEG_DATE,
MAX(T.CAL_DAY) AS END_DATE,
T.FLAG,
COUNT(1) AS "连续天数"
FROM (SELECT T.CAL_DAY,
T.FLAG,
ROWNUM AS RN,
ROWNUM - ROW_NUMBER() OVER(PARTITION BY T.FLAG ORDER BY T.CAL_DAY) AS QJ
FROM TEST_GROUP T) T
GROUP BY T.FLAG
T.QJ
ORDER BY 1;
本站文章除注明转载/出处外,均为本站原创,转载前请务必署名,转载请标明出处
最后编辑时间为: 2021/12/27 17:11:43