這是表格:
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;