sql - 如何从 Oracle SQL 中的连续列中获取运行总计
问题描述
我无法从 Oracle SQL 中的现有日期数据集中显示连续假期。例如,2017 年 12 月 20 日至 30 日之间,有以下休息日(因为圣诞节和周末):
- 23.12.2017 星期六
- 24.12.2017 星期日
- 25.12.2017 圣诞节
- 30.12.2017 星期六
现在我希望我的结果数据集看起来像这样(需要 RUNTOT):
DAT ISOFF RUNTOT
20.12.2017 0 0
21.12.2017 0 0
22.12.2017 0 0
23.12.2017 1 1
24.12.2017 1 2
25.12.2017 1 3
26.12.2017 0 0
27.12.2017 0 0
28.12.2017 0 0
29.12.2017 0 0
30.12.2017 1 1
这意味着当“ISOFF”更改时,我想计算(或求和)“ISOFF”为 1 的连续行。
我尝试使用分析函数来解决解决方案,其中我将“ISOFF”总结到当前行。
SELECT DAT,
ISOFF,
SUM (ISOFF)
OVER (ORDER BY DAT ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
AS RUNTOT
FROM (TIME_DATASET)
WHERE DAT BETWEEN DATE '2017-12-20' AND DATE '2017-12-27'
ORDER BY 1
我现在得到的是以下数据集:
DAT ISOFF RUNTOT
20.12.2017 0 0
21.12.2017 0 0
22.12.2017 0 0
23.12.2017 1 1
24.12.2017 1 2
25.12.2017 1 3
26.12.2017 0 3
27.12.2017 0 3
28.12.2017 0 3
29.12.2017 0 3
30.12.2017 1 4
如果 ISOFF 更改为 0,如何重置运行总计?或者这是解决这个问题的错误方法?
感谢您的帮助!
解决方案
这是一个差距和孤岛问题。这是一种按 0 到该行的数量分配组的方法:
select t.*,
(case when is_off = 1
then row_number() over (partition by grp order by dat)
end) as runtot
from (select t.*,
sum(case when is_off = 0 then 1 else 0 end) over (order by dat) as grp
from TIME_DATASET t
) t;
推荐阅读
- c - 如何使用 librdkafka 发送 json 数据?
- powershell - 如何在 Powershell 中使用 Start-Process 命令最小化 UWP 应用程序?
- python - Pandas - 如何替换单引号后跟逗号(“,”)
- amazon-web-services - 具有多重身份验证的 AWS CodeCommit。不断致命:无法访问..请求的 URL 返回错误:403
- c++ - DFS 遍历:节点以相反的顺序打印
- android - android kotlin 属性不会随着传递给适配器的方法而改变
- reactjs - 部署 NextJs 时在 Vercel 中发生构建错误:无效的 JSON 令牌
- python-3.x - Python3 套接字编程
- elasticsearch - 如何编写弹性搜索聚合管道 JUnit 测试用例?
- java - 使用 JPA 的查询中的 ID 无效标识符