如何用PostgreSQL窗口函数生成指定年份的最小销售额列?
正确的PostgreSQL查询语句
原始销售数据表:
| 年份 | 销售额 |
|---|---|
| 2021 | 1000 |
| 2022 | 1500 |
| 2023 | 2000 |
错误原因分析
你之前的语句 select *,min(sales) over (partition by year=2022) from table 逻辑有误:partition by year=2022 会把数据拆成两个分区——year=2022 的行单独成区,其余行成另一个区,因此min(sales)会分别计算两个分区的最小值,导致非2022年的行显示各自分区的最小值,不符合需求。
正确查询语句(窗口函数实现)
SELECT year, sales, MIN(CASE WHEN year = 2022 THEN sales END) OVER () AS min FROM your_table;
执行结果
执行后将得到预期的结果:
| 年份 | 销售额 | min |
|---|---|---|
| 2021 | 1000 | 1500 |
| 2022 | 1500 | 1500 |
| 2023 | 2000 | 1500 |
逻辑说明
CASE WHEN year = 2022 THEN sales END:仅在年份为2022时返回对应销售额,其余行返回NULLMIN(...) OVER ():OVER ()指定窗口覆盖所有行,MIN函数会忽略NULL值,最终计算出的就是2022年的销售额,且会填充到每一行中
内容的提问来源于stack exchange,提问作者Elvin Mammadov
相关产品推荐
相关产品推荐

