Maison  >  Questions et réponses  >  le corps du texte

Résultats incorrects lors de l'utilisation de last_value()

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粉486743671P粉486743671187 Il y a quelques jours359

répondre à tous(1)je répondrai

  • P粉253800312

    P粉2538003122024-04-01 09:18:04

    FIRST_VALUELAST_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;

    répondre
    0
  • Annulerrépondre