Maison > Questions et réponses > le corps du texte
Voici le formulaire :
id | Région | Variété | Prix |
---|---|---|---|
1 | Vallée Alexandre | Cabernet Sauvignon | 35 |
2 | Vallée Alexandre | Cabernet Sauvignon | 45 |
3 | Vallée Alexandre | Merlot | 19 |
4 | Californie | Sauvignon Blanc | 8 |
5 | Californie | Pinot Noir | 17 |
Je souhaite connaître les variétés les moins chères et les plus chères dans chaque région, le résultat devrait donc être :
Région | Cher | Pas cher |
---|---|---|
Vallée Alexandre | Cabernet Sauvignon | Merlot |
Californie | Pinot Noir | Sauvignon Blanc |
J'ai pu obtenir les bons résultats en utilisant les deux 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
Je pense que cela équivaut à la requête suivante
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
Mais maintenant, mon résultat est :
Région | Cher | Pas cher |
---|---|---|
Vallée Alexandre | Cabernet Sauvignon | Cabernet Sauvignon |
Vallée Alexandre | Cabernet Sauvignon | Merlot |
Californie | Pinot Noir | Pinot Noir |
Californie | Pinot Noir | Sauvignon Blanc |
Pourquoi ma sortie est-elle fausse ? Je suis confus.
P粉2538003122024-04-01 09:18:04
FIRST_VALUE
和 LAST_VALUE
的默认窗口是 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. c'est à dire. C'est la première réponse. La dernière valeur est "jusqu'à présent".
Cependant, vous souhaitez que cela s'applique à l'ensemble de données, vous devez donc décrire explicitement la plage de fenêtres :
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;