Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:满足特定条件的滚动周窗口分区内的行数总和_Sql_Presto - Fatal编程技术网

SQL:满足特定条件的滚动周窗口分区内的行数总和

SQL:满足特定条件的滚动周窗口分区内的行数总和,sql,presto,Sql,Presto,目标:在连续4周的时间窗内,统计一周、两周、三周和四周内未达到目标的人数 我们的想法是使用一个分析函数,按工作周(WW)进行划分,以获得任何给定周内低于目标的人数。一个人不必连续数周处于目标之下。如果一个人至少有一周没有达到目标,不管是哪一个工作周,都要计算。如果他们在任何两周内都没有达到目标,那么计算一下,以此类推 如果(分数

目标:在连续4周的时间窗内,统计一周、两周、三周和四周内未达到目标的人数

我们的想法是使用一个分析函数,按工作周(WW)进行划分,以获得任何给定周内低于目标的人数。一个人不必连续数周处于目标之下。如果一个人至少有一周没有达到目标,不管是哪一个工作周,都要计算。如果他们在任何两周内都没有达到目标,那么计算一下,以此类推

如果(分数<50,1,0)作为目标

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。我以为有这么多号码会让它看起来很忙。我已经更新了描述