SQL:满足特定条件的滚动周窗口分区内的行数总和
目标:在连续4周的时间窗内,统计一周、两周、三周和四周内未达到目标的人数 我们的想法是使用一个分析函数,按工作周(WW)进行划分,以获得任何给定周内低于目标的人数。一个人不必连续数周处于目标之下。如果一个人至少有一周没有达到目标,不管是哪一个工作周,都要计算。如果他们在任何两周内都没有达到目标,那么计算一下,以此类推 如果(分数<50,1,0)作为目标SQL:满足特定条件的滚动周窗口分区内的行数总和,sql,presto,Sql,Presto,目标:在连续4周的时间窗内,统计一周、两周、三周和四周内未达到目标的人数 我们的想法是使用一个分析函数,按工作周(WW)进行划分,以获得任何给定周内低于目标的人数。一个人不必连续数周处于目标之下。如果一个人至少有一周没有达到目标,不管是哪一个工作周,都要计算。如果他们在任何两周内都没有达到目标,那么计算一下,以此类推 如果(分数
week person target
WW 31 name_x 1
WW 31 name_y 1
WW 31 name_z 0
--------------------
WW 32 name_x 1
WW 32 name_y 1
WW 32 name_z 0
--------------------
WW 33 name_x 0
WW 33 name_y 1
WW 33 name_z 0
--------------------
WW 34 name_x 1
WW 34 name_y 1
WW 34 name_z 0
期望的输出将是一个表格,我可以从中构建这样的可视化,其中y轴是一条线,计算1、2、3和4周内低于目标的人数。
我试过这样的东西
SUM(当target=1时,则为1,否则为0结束)超过(按周划分)
这适用于计算至少一周未达到目标的人数,但我正在努力为至少2周、3周或4周未达到目标的人数计算。您可以使用
LAG()检查前几周的目标。:
滞后(x[,偏移量[,默认值])→ [与输入相同]
返回值
窗口中当前行之前的偏移行偏移开始于
0,它是当前行。偏移量可以是任何标量表达式。
默认偏移量为1。如果偏移量为null或大于
窗口中,返回默认的_值,或者如果未指定为null
他回来了
类似于此的查询将获得所需的结果:
with data_table as
(
select week, person, target
,LAG(target,1,null)OVER(PARTITION BY person ORDER BY week) target_1w_ago
,LAG(target,2,null)OVER(PARTITION BY person ORDER BY week) target_2w_ago
,LAG(target,3,null)OVER(PARTITION BY person ORDER BY week) target_3w_ago
from table
)
select week
,sum(target) "Weeks under 1"
,sum(case when target=1 and target_1w_ago=1 then 1 else 0 end) "Weeks under 2"
,sum(case when target=1 and target_1w_ago=1 and target_2w_ago=1 then 1 else 0 end) "Weeks under 3"
,sum(case when target=1 and target_1w_ago=1 and target_2w_ago=1 and target_3w_ago=1 then 1 else 0 end) "Weeks under 4"
from data_table
group by week
order by week
您的样本数据没有日期或星期指示。这是如何计算的?我遗漏了一些细节,但本质上我正在使用一个4周的滚动窗口,在这个窗口中,一周(1-52)随着时间的推移而变化。我用字母来表示一周,只是为了让它看起来简单。因为这是一个滚动窗口,所以在我之前的临时表中,我使用密集行分析函数将窗口中的第一周转换为1,将窗口中的最后一周转换为4。在我的示例数据中,1=A,D=4。我以为有这么多号码会让它看起来很忙。我已经更新了描述