此 Postgresql ROLLUP 分组不适用于 Window 表达式

问题描述 投票:0回答:1

以下 SQL 运行良好;它为我提供了我想要的计数和百分比结果:(请在需要时使用 EXTRACT (YEAR|MONTH|DAY ...)):

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
   ;

但是,如果我引入 ROLLUP,我会得到 cnt 总数,但不会得到使用窗口表达式的百分比总数:

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 group-by rollup
1个回答
0
投票

ROLLUP 的行为是为指定的列生成小计和总计,但它不能很好地与窗口函数配合使用,因为 Rollup 会在结果中引入额外的行,这可能会影响窗口函数的计算。 可能的解决方案:在应用窗口函数之前尝试使用子查询来计算每个组的总计数

© www.soinside.com 2019 - 2024. All rights reserved.