以下SQL运行良好;它给出了我想要的计数和百分比结果:(如果需要,请使用EXTRACT(年|月|日...)):
SELECT YEAR(evt_date) AS yr, MONTH(evt_date) AS mth, DAY(evt_date) AS dy, COUNT(*) AS cnt,
ROUND(COUNT(*)*100 / (SUM(COUNT(*)) OVER (PARTITION BY YEAR(evt_date), MONTH(evt_date))), 2) AS prct
FROM my_data
WHERE evt_date >= '2023-11-01'
GROUP BY yr, mth, dy
ORDER BY 1,2,3
;
但是,如果我在中引入汇总,我会得到cnt合计,但不会得到使用窗口表达式的百分比的合计.This must be a bug,但我没有办法报告它被修复:
SELECT YEAR(evt_date) AS yr, MONTH(evt_date) AS mth, DAY(evt_date) AS dy, COUNT(*) AS cnt,
ROUND(COUNT(*)*100 / (SUM(COUNT(*)) OVER (PARTITION BY YEAR(evt_date), MONTH(evt_date))), 2) AS prct
FROM my_data
WHERE evt_date >= '2023-11-01'
GROUP BY yr, ROLLUP (mth, dy) -- ROLLUP does not give the the result I expect to see for the percentage column
ORDER BY 1,2,3
;
有人知道为什么吗?我使用的是PostgreSQL V12.
我有一个有技巧的替代解决方案,但奇怪的是上面的那个不起作用:
WITH my_data(evt_date, foo) AS
(SELECT '2023-11-01'::DATE, 'X' UNION
SELECT '2023-11-01', 'Y' UNION
SELECT '2023-11-02', 'X' UNION
SELECT '2023-11-02', 'Y' UNION
SELECT '2024-01-01', 'X' UNION
SELECT '2024-01-01', 'Y' UNION
SELECT '2024-01-01', 'Z' UNION
SELECT '2024-01-02', 'X' UNION
SELECT '2024-01-02', 'Y' UNION
SELECT '2024-01-03', 'X' UNION
SELECT '2024-01-03', 'Y' UNION
SELECT '2024-01-03', 'Z' UNION
SELECT '2024-01-03', 'W'
),
totals AS
(SELECT YEAR(evt_date) AS yr, MONTH(evt_date) AS mth, DAY(evt_date) AS dy, COUNT(*) AS cnt,
ROUND(COUNT(*)*100 / (SUM(COUNT(*)) OVER (PARTITION BY YEAR(evt_date), MONTH(evt_date))), 2) AS prct
FROM my_data
WHERE evt_date >= '2023-11-01'
GROUP BY yr, mth, dy
ORDER BY 1,2,3
)
SELECT yr, mth, dy, SUM(cnt) AS cnt, SUM(prct) AS prct --<-- Fake SUM() to be able to use ROLLUP
FROM totals
GROUP BY yr, ROLLUP (mth, dy) --- Only way? for ROLLUP to handle the percentage column well
ORDER BY 1,2,3