sql - Redshift 根据条件计算连续天数,并在条件不存在时中断(停止计数)
问题描述
桌子
Date Region_1 Region_2
27-Sep 100 97.69
28-Sep 53.84 98.21
29-Sep 88.88 10
30-Sep 8.33 96
01-Oct 25 97.63
02-Oct 20 94.82
03-Oct 25 100
04-Oct 12.5 60.86
05-Oct 10 67.29
06-Oct 42.85 63.85
07-Oct 7.14 66.25
08-Oct 14.28 71.05
09-Oct 16.66 69.48
10-Oct 25 72.64
11-Oct 12.5 0
预期产出
Region_1_Compliant_days Region_2_compliant_Days
1 2
只有当百分比大于 60 % 时,我才尝试计算每个区域的连续天数。但我没有得到正确的结果。
case when region_1 > 60.0 and count(date) over (partition by date desc) then 1 else 0 end
但以上是计算所有大于 60.0 的实例,而不仅仅是连续天数。
解释:region1 27号是100,所以大于60就算了 region2也是如此
Region2 有很多天超过 60。但我只考虑 2 天的原因是:27 日和 28 日的值大于 60,但 29 日是 10.,这意味着链在那里中断。所以我只计算前两天.. 即使我们在 29 日之后的剩余日子里还有 60 多天。
请让我知道如何实现。
谢谢
解决方案
你可以试试下面的查询,
select sum(Region_1_Compliant_days) Region_1_Compliant_days
,sum(Region_2_Compliant_days) Region_2_Compliant_days
from
(
select d.*
,min(case when region_1 > 60 then 1 else 0 end) over (order by dt rows between unbounded preceding and current row) Region_1_Compliant_days
,min(case when region_2 > 60 then 1 else 0 end) over (order by dt rows between unbounded preceding and current row) Region_2_Compliant_days
from table1 d
) t;
使用 window 子句,我们总是在所有先前行和当前行之间寻找一个窗口,如果我们发现 min 为 0,这意味着有一个值 < 60,然后设置为 0
希望我说得通,它按预期工作。
推荐阅读
- sql - 按名称分组的连续日期范围内的最小和最大日期
- c++ - CPU如何“投射”浮点x87(我认为)值?
- c++ - g++ 和双精度
- python-3.x - 如何在 Python 中对子类的更改最小的情况下稍微修改从父 __init__() 继承的属性?
- java - 从java中的文件中删除一个对象
- laravel - 如何使用 Laravel Dusk 或 WebDriverBy 在表格的“textarea”中输入文本?
- python - 如果元素相同,则用于查找索引元素的编号的 Python 列表索引
- swift - 如何在 SwiftUI 的不同视图中保留列表
- image - 用于内联图片或形状的 Word 2007 VBA 通配符
- swift - Audiokit AKSampler 作为单独类中的 AKNode/AKPolyphonicNode