Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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_Postgresql_Group By_Window Functions_Cumulative Sum - Fatal编程技术网

Sql 为什么窗口函数需要组中的聚合列

Sql 为什么窗口函数需要组中的聚合列,sql,postgresql,group-by,window-functions,cumulative-sum,Sql,Postgresql,Group By,Window Functions,Cumulative Sum,我已经使用了相当多的窗口函数,但我认为我对它们的工作原理了解不够,无法回答它们为什么会这样做 对于我正在处理的查询(下面),为什么要求我获取聚合字段并将其添加到group by?(在我下面查询的后半部分中,如果我没有将“事件”包含在我的第二个分组中,我将无法生成结果) 我已经遇到了足够多,我只是认为它是理所当然的,但我真的很想更多的颜色,因为为什么这是必要的。有没有一种方法可以使这些文件的格式不同,以避免这种(有些不直观的)要求 非常感谢 你要找的大概是一个累积的总和。这将是: select m

我已经使用了相当多的窗口函数,但我认为我对它们的工作原理了解不够,无法回答它们为什么会这样做

对于我正在处理的查询(下面),为什么要求我获取聚合字段并将其添加到group by?(在我下面查询的后半部分中,如果我没有将“事件”包含在我的第二个分组中,我将无法生成结果)

我已经遇到了足够多,我只是认为它是理所当然的,但我真的很想更多的颜色,因为为什么这是必要的。有没有一种方法可以使这些文件的格式不同,以避免这种(有些不直观的)要求


非常感谢

你要找的大概是一个累积的总和。这将是:

select month, EventAge,
       sum(sum(Events)) over (partition by month
                              order by SubAge asc 
                              rows between unbounded preceding and current row
                             ) as TotEvents
from data
group by 1, 2
order by 1, 2 ;
为什么??这可能有点难以解释。如果您看到具有子查询的等效版本,可能会更清楚:

select me.*
       sum(sum_events) over (partition by month
                             order by SubAge asc 
                             rows between unbounded preceding and current row
                            ) as TotEvents
from (select month, EventAge, sum(events) as sum_events
      from data
      group by 1, 2
     ) me
order by 1, 2 ;
这几乎就是查询的简写。窗口函数在聚合后进行求值。您希望对聚合后的事件总和进行求和。因此,您需要
sum(sum(events))
。聚合后,
事件
不再可用


聚合函数的嵌套一开始很尴尬——至少对我来说是这样。当我第一次开始使用窗口函数时,我想我首先花了几天时间使用子查询编写聚合查询,然后在没有子查询的情况下重写。很快,我就习惯了在没有子查询的情况下编写它们。

这是我发现的最相似的问题,但它似乎没有回答我提出的问题,因为我认为我已经包含了我分组所依据的所有字段,而不是被要求添加到聚合字段中!谢谢@Gordon。我使用的结构是您在下面提到的子查询版本。我在(..)上做一个求和([AggField1]),其中[AggField1]=“Count(distinct ID),其中条件为true”。我所看到的与您在子查询版本中看到的最大区别是,您没有在最外层的查询中请求group by。当我更新查询以将组删除1,2时,[sum_events]会按预期工作。这有助于避免它。但仍在努力理解为什么会这样。哦,好吧,你的方式更好@杰多尔。因为窗口函数是在聚合之后计算的<代码>事件在聚合(您想要的)之后不存在,但是
总和(事件)
存在。
select me.*
       sum(sum_events) over (partition by month
                             order by SubAge asc 
                             rows between unbounded preceding and current row
                            ) as TotEvents
from (select month, EventAge, sum(events) as sum_events
      from data
      group by 1, 2
     ) me
order by 1, 2 ;