首页 > 解决方案 > 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 多天。

请让我知道如何实现。

谢谢

标签: sqlamazon-redshiftwindow-functions

解决方案


你可以试试下面的查询,

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

希望我说得通,它按预期工作。


推荐阅读