这是表格:
id | 地区 | 品种 | 价格 |
---|---|---|---|
1 | 亚历山大谷 | 赤霞珠 | 35 |
2 | 亚历山大谷 | 赤霞珠 | 45 |
3 | 亚历山大谷 | 梅洛 | 19 |
4 | 加利福尼亚州 | 长相思 | 8 |
5 | 加利福尼亚州 | 黑皮诺 | 17 |
我想找出每个地区最便宜和最昂贵的品种,因此输出应该是:
地区 | 贵 | 便宜 |
---|---|---|
亚历山大谷 | 赤霞珠 | 梅洛 |
加利福尼亚州 | 黑皮诺 | 长相思 |
我能够使用两个 first_value()
获得正确的结果
SELECT DISTINCT region, FIRST_VALUE(variety) OVER (PARTITION BY region ORDER BY price DESC) AS expensive, FIRST_VALUE(variety) OVER (PARTITION BY region ORDER BY price) AS cheapest FROM wine_list
我认为它相当于以下查询
SELECT DISTINCT region, FIRST_VALUE(variety) OVER (PARTITION BY region ORDER BY price DESC) AS expensive, LAST_VALUE(variety) OVER (PARTITION BY region ORDER BY price DESC) AS cheapest FROM wine_list
但是现在我的输出是:
地区 | 贵 | 便宜 |
---|---|---|
亚历山大谷 | 赤霞珠 | 赤霞珠 |
亚历山大谷 | 赤霞珠 | 梅洛 |
加利福尼亚州 | 黑皮诺 | 黑皮诺 |
加利福尼亚州 | 黑皮诺 | 长相思 |
为什么我的输出是错误的?我很困惑。
P粉2538003122024-04-01 09:18:04
FIRST_VALUE
和 LAST_VALUE
的默认窗口是 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
。 IE。这是第一个响应。最后一个值“到目前为止”。
但是,您希望它适用于整个数据集,因此您必须明确描述窗口范围:
SELECT DISTINCT region, FIRST_VALUE(variety) OVER (PARTITION BY region ORDER BY price DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS expensive, LAST_VALUE(variety) OVER (PARTITION BY region ORDER BY price DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS cheapest FROM wine_list;