为什么 Window 函数需要我在组中的聚合列
Why Window Functions Require My Aggregated Column in Group
我一直在与 window 函数打交道,但我认为我对它们的工作方式了解不够,无法回答它们为何如此行事。
对于我正在处理的查询(如下),为什么我需要获取聚合字段并将其添加到分组依据? (在下面查询的后半部分,如果我不在第二组中包含 "Events",我将无法生成结果)
With Data as (
Select
CohortDate as month
,datediff(week,CohortDate,EventDate) as EventAge
,count(distinct case when EventDate is not null then GUID end) as Events
From MyTable
where month >= [getdate():month] - interval '12 months'
group by 1, 2
order by 1, 2
)
Select
month
,EventAge
,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, Events
order by 1, 2
我已经 运行 深入了解了这一点,以至于我认为这是理所当然的,但我真的很喜欢更多关于为什么需要它的颜色。有没有一种方法我应该以不同的方式格式化这些以避免这种(有点不直观的)要求?
非常感谢!
你要找的大概是一个累计数。那将是:
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 ;
这几乎是查询的 shorthand。 window 函数在 聚合后计算 。您想在聚合后对事件的 SUM 求和。因此,你需要sum(sum(events))
。聚合后,events
不再可用。
聚合函数的嵌套起初很尴尬——至少对我来说是这样。当我第一次开始使用 window 函数时,我想我首先花了几天时间使用子查询编写聚合查询,然后在没有子查询的情况下重写。很快,我就习惯了在没有子查询的情况下编写它们。
我一直在与 window 函数打交道,但我认为我对它们的工作方式了解不够,无法回答它们为何如此行事。
对于我正在处理的查询(如下),为什么我需要获取聚合字段并将其添加到分组依据? (在下面查询的后半部分,如果我不在第二组中包含 "Events",我将无法生成结果)
With Data as (
Select
CohortDate as month
,datediff(week,CohortDate,EventDate) as EventAge
,count(distinct case when EventDate is not null then GUID end) as Events
From MyTable
where month >= [getdate():month] - interval '12 months'
group by 1, 2
order by 1, 2
)
Select
month
,EventAge
,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, Events
order by 1, 2
我已经 运行 深入了解了这一点,以至于我认为这是理所当然的,但我真的很喜欢更多关于为什么需要它的颜色。有没有一种方法我应该以不同的方式格式化这些以避免这种(有点不直观的)要求?
非常感谢!
你要找的大概是一个累计数。那将是:
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 ;
这几乎是查询的 shorthand。 window 函数在 聚合后计算 。您想在聚合后对事件的 SUM 求和。因此,你需要sum(sum(events))
。聚合后,events
不再可用。
聚合函数的嵌套起初很尴尬——至少对我来说是这样。当我第一次开始使用 window 函数时,我想我首先花了几天时间使用子查询编写聚合查询,然后在没有子查询的情况下重写。很快,我就习惯了在没有子查询的情况下编写它们。