我可以对多个 window 函数调用使用一个 PARTITION 定义吗?
Can I use one PARTITION definition for multiple window function calls?
这是我的查询。我对 14 个结果列使用具有相同分区定义的相同 window 函数 sum()
:
select id,weekly,
sum(totalsteps) OVER (PARTITION BY id, weekly) as total_steps,
sum(totaldistance) OVER (PARTITION BY id, weekly) as total_distance,
sum(veryactiveminutes) OVER (PARTITION BY id, weekly) as total_veryactive,
sum(fairlyactiveminutes) OVER (PARTITION BY id, weekly) as total_fairlyactive,
sum(lightlyactiveminutes) OVER (PARTITION BY id, weekly) as total_lightlyactive,
sum(totalsteps) OVER (PARTITION BY id, weekly) as total_steps,
sum(totaldistance) OVER (PARTITION BY id, weekly) as total_distance,
sum(veryactivedistance) OVER (PARTITION BY id, weekly) as total_veryactivedistance,
sum(moderatelyactivedistance) OVER (PARTITION BY id, weekly) as total_moderatelyactivedistance,
sum(lightactivedistance) OVER (PARTITION BY id, weekly) as total_lightactivedistance,
sum(sedentaryactivedistance) OVER (PARTITION BY id, weekly) as total_sedentaryactivedistance,
sum(calories) OVER (PARTITION BY id, weekly) as total_calories,
sum(totalminutesasleep) OVER (PARTITION BY id, weekly) as total_asleep,
sum(totaltimeinbed) OVER (PARTITION BY id, weekly) as total_inbed
from (select *, date_trunc('week', activitydate) as weekly
from activitysleep_merged
) as weeklysum
每个金额都必须拼写 OVER (PARTITION BY id, weekly)
吗?
有没有更好的方法来重写我的查询?
你可以尝试使用WINDOW
子句,可选的WINDOW子句有一般形式
WINDOW window_name AS ( window_definition ) [, ...]
然后用OVER
window_name做你的聚合函数,可能更优雅
select id,weekly,
sum(totalsteps) over w as total_steps,
sum(totaldistance) over w as total_distance,
sum(veryactiveminutes) over w as total_veryactive,
sum(fairlyactiveminutes) over w as total_fairlyactive,
sum(lightlyactiveminutes) over w as total_lightlyactive,
sum(totalsteps) over w as total_steps,
sum(totaldistance) over w as total_distance,
sum(veryactivedistance) over w as total_veryactivedistance,
sum(moderatelyactivedistance) over w as total_moderatelyactivedistance,
sum(lightactivedistance) over w as total_lightactivedistance,
sum(sedentaryactivedistance) over w as total_sedentaryactivedistance,
sum(calories) over w as total_calories,
sum(totalminutesover w as leep) over w as total_over w as leep,
sum(totaltimeinbed) over w as total_inbed
from (
select *, date_trunc('week', activitydate) as weekly
from activitysleep_merged
) WINDOW w AS ( PARTITION BY id, weekly );
更详细的可以参考WINDOW Clause
您可以使用 WINDOW clause.
SELECT id, weekly
, sum(totalsteps) OVER w AS total_steps
, sum(totaldistance) OVER w AS total_distance
, ...
FROM (SELECT *, date_trunc('week', activitydate) AS weekly FROM activitysleep_merged ) AS weeklysum
WINDOW w AS (PARTITION BY id, weekly); -- !
您仍然需要重复 OVER
关键字,但可以将分区的实际定义替换为 WINDOW
子句中声明的标识符。
这是语法快捷方式,对性能没有影响。在任何一种情况下,Postgres 都会 re-use 相同的分区。
相关:
聚合?
也就是说,您的查询看起来很可疑 不 想要 window 函数开始,但是 普通聚合 .在使用它时,您实际上 不需要 该子查询:
SELECT id, date_trunc('week', activitydate) AS weekly
, sum(totalsteps) AS total_steps
, sum(totaldistance) AS total_distance
, ...
FROM activitysleep_merged
GROUP BY 1, 2 -- !
ORDER BY 1, 2 -- or BY 2, 1 ?
并且您需要订购结果。
这会为每个 (id, weekly)
生成一个(聚合的)行 - 与原始查询相反,returns 每个输入行一行。
我加入了位置引用作为语法快捷方式,因为这个问题是关于短语法的。相关:
- Select first row in each GROUP BY group?
这是我的查询。我对 14 个结果列使用具有相同分区定义的相同 window 函数 sum()
:
select id,weekly,
sum(totalsteps) OVER (PARTITION BY id, weekly) as total_steps,
sum(totaldistance) OVER (PARTITION BY id, weekly) as total_distance,
sum(veryactiveminutes) OVER (PARTITION BY id, weekly) as total_veryactive,
sum(fairlyactiveminutes) OVER (PARTITION BY id, weekly) as total_fairlyactive,
sum(lightlyactiveminutes) OVER (PARTITION BY id, weekly) as total_lightlyactive,
sum(totalsteps) OVER (PARTITION BY id, weekly) as total_steps,
sum(totaldistance) OVER (PARTITION BY id, weekly) as total_distance,
sum(veryactivedistance) OVER (PARTITION BY id, weekly) as total_veryactivedistance,
sum(moderatelyactivedistance) OVER (PARTITION BY id, weekly) as total_moderatelyactivedistance,
sum(lightactivedistance) OVER (PARTITION BY id, weekly) as total_lightactivedistance,
sum(sedentaryactivedistance) OVER (PARTITION BY id, weekly) as total_sedentaryactivedistance,
sum(calories) OVER (PARTITION BY id, weekly) as total_calories,
sum(totalminutesasleep) OVER (PARTITION BY id, weekly) as total_asleep,
sum(totaltimeinbed) OVER (PARTITION BY id, weekly) as total_inbed
from (select *, date_trunc('week', activitydate) as weekly
from activitysleep_merged
) as weeklysum
每个金额都必须拼写 OVER (PARTITION BY id, weekly)
吗?
有没有更好的方法来重写我的查询?
你可以尝试使用WINDOW
子句,可选的WINDOW子句有一般形式
WINDOW window_name AS ( window_definition ) [, ...]
然后用OVER
window_name做你的聚合函数,可能更优雅
select id,weekly,
sum(totalsteps) over w as total_steps,
sum(totaldistance) over w as total_distance,
sum(veryactiveminutes) over w as total_veryactive,
sum(fairlyactiveminutes) over w as total_fairlyactive,
sum(lightlyactiveminutes) over w as total_lightlyactive,
sum(totalsteps) over w as total_steps,
sum(totaldistance) over w as total_distance,
sum(veryactivedistance) over w as total_veryactivedistance,
sum(moderatelyactivedistance) over w as total_moderatelyactivedistance,
sum(lightactivedistance) over w as total_lightactivedistance,
sum(sedentaryactivedistance) over w as total_sedentaryactivedistance,
sum(calories) over w as total_calories,
sum(totalminutesover w as leep) over w as total_over w as leep,
sum(totaltimeinbed) over w as total_inbed
from (
select *, date_trunc('week', activitydate) as weekly
from activitysleep_merged
) WINDOW w AS ( PARTITION BY id, weekly );
更详细的可以参考WINDOW Clause
您可以使用 WINDOW clause.
SELECT id, weekly
, sum(totalsteps) OVER w AS total_steps
, sum(totaldistance) OVER w AS total_distance
, ...
FROM (SELECT *, date_trunc('week', activitydate) AS weekly FROM activitysleep_merged ) AS weeklysum
WINDOW w AS (PARTITION BY id, weekly); -- !
您仍然需要重复 OVER
关键字,但可以将分区的实际定义替换为 WINDOW
子句中声明的标识符。
这是语法快捷方式,对性能没有影响。在任何一种情况下,Postgres 都会 re-use 相同的分区。
相关:
聚合?
也就是说,您的查询看起来很可疑 不 想要 window 函数开始,但是 普通聚合 .在使用它时,您实际上 不需要 该子查询:
SELECT id, date_trunc('week', activitydate) AS weekly
, sum(totalsteps) AS total_steps
, sum(totaldistance) AS total_distance
, ...
FROM activitysleep_merged
GROUP BY 1, 2 -- !
ORDER BY 1, 2 -- or BY 2, 1 ?
并且您需要订购结果。
这会为每个 (id, weekly)
生成一个(聚合的)行 - 与原始查询相反,returns 每个输入行一行。
我加入了位置引用作为语法快捷方式,因为这个问题是关于短语法的。相关:
- Select first row in each GROUP BY group?