你可以對同一查詢級別的聚合函數的結果運行一個窗口函數。這只是簡單得多的這種情況下使用子查詢:
SELECT *, sum(count_registered_users) OVER (ORDER BY month, week, day) AS running_sum
FROM (
SELECT extract(month FROM registration_time)::int AS month
, extract(week FROM registration_time)::int%4+1 AS week
, extract(day FROM registration_time)::int AS day
, count(*) AS count_registered_users
FROM loyalty.v_user
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3
) sub;
我也是固定的表達計算week
語法。 extract()
返回double precision
,但模運算符%
不接受double precision
數字。我將所有三個投入到integer
,同時處於此狀態。
與@a_horse commented一樣,不能在窗口函數的ORDER BY
子句中使用位置引用(與查詢的ORDER BY
子句不同)。
但是,您不能在此查詢中使用over (order by registration_time)
,因爲您正在按month
,week
,day
進行分組。根據需要,registration_time
既不合並,也不在GROUP BY
子句中。在查詢評估的這個階段,您不能再訪問該列。
您可以重複前三SELECT
項目的表達式ORDER BY
子句中,使其工作:
SELECT extract(month FROM registration_time)::int AS month
, extract(week FROM registration_time)::int%4+1 AS week
, extract(day FROM registration_time)::int AS day
, count(*) AS count_registered_users
, sum(count(*)) OVER (ORDER BY
extract(month FROM registration_time)::int
, extract(week FROM registration_time)::int%4+1
, extract(day FROM registration_time)::int) AS running_sum
FROM loyalty.v_user
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3;
但似乎相當嘈雜。 (雖然性能會很好。)
另外:我想知道week%4+1
背後的目的......整個查詢可能會更簡單。
相關:
您不能在一個窗口定義中使用的列數的順序(和'(1,2,3)'是什麼不同於'1,2,3' - 不要使用無用的括號)。 'over(order by registration_time)'應該做你想做的事 –
使用'order by registration_time'仍然會出現同樣的錯誤。我的sum函數本身的語法是正確的嗎? – simplycoding