PostgreSQL中如何基于其他列的值聚合指定列
正确的PostgreSQL查询方案:按date和status聚合统计水果数量
原查询的问题在于GROUP BY子句包含了fruit和numberOfFruits,这会让每一行单独成为一个分组,导致聚合函数计算的结果和当前行的numberOfFruits完全一致,根本没实现按date和status聚合的需求。
要实现需求,应该使用窗口函数,在保留原表所有数据的同时,为每一行添加上对应date+status分组的统计值,正确的SQL如下:
SELECT date, fruit, status, numberOfFruits, AVG(numberOfFruits) OVER (PARTITION BY date, status) AS AvgNumOfFruits, MIN(numberOfFruits) OVER (PARTITION BY date, status) AS MinNumOfFruits, MAX(numberOfFruits) OVER (PARTITION BY date, status) AS MaxNumOfFruits FROM fruitdata ORDER BY fruit, date;
逻辑说明
- 窗口函数通过
PARTITION BY date, status指定分组规则:将相同日期、相同状态的行归为一组 AVG()/MIN()/MAX()分别计算每组内numberOfFruits的平均值、最小值、最大值,将结果附加到组内每一行- 最后按
fruit和date排序,符合需求
期望输出结果
| date | fruit | status | numberOfFruits | AvgNumOfFruits | MinNumOfFruits | MaxNumOfFruits |
|---|---|---|---|---|---|---|
| 2022-01 | apple | ripe | 3 | 6.5 | 3 | 10 |
| 2022-02 | apple | ripe | 3 | 3 | 3 | 3 |
| 2022-01 | banana | mature | 5 | 7 | 5 | 9 |
| 2022-02 | banana | mature | 3 | 5 | 3 | 7 |
| 2022-01 | grapes | mature | 9 | 7 | 5 | 9 |
| 2022-02 | grapes | mature | 7 | 5 | 3 | 7 |
| 2022-01 | pear | ripe | 10 | 6.5 | 3 | 10 |
| 2022-02 | pear | ripe | 3 | 3 | 3 | 3 |
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

