以下 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
;
有人知道原因或有替代解决方案吗?
ROLLUP 的行为是为指定的列生成小计和总计,但它不能很好地与窗口函数配合使用,因为 Rollup 会在结果中引入额外的行,这可能会影响窗口函数的计算。 可能的解决方案:在应用窗口函数之前尝试使用子查询来计算每个组的总计数