Maison >base de données >tutoriel mysql >Comment puis-je sélectionner efficacement des valeurs basées sur le maximum dans Oracle SQL à l'aide des fonctions de fenêtre ?

Comment puis-je sélectionner efficacement des valeurs basées sur le maximum dans Oracle SQL à l'aide des fonctions de fenêtre ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-17 19:17:09543parcourir

How Can I Efficiently Select Maximum-Based Values in Oracle SQL Using Window Functions?

Oracle SQL : Extraction des valeurs maximales avec les fonctions de fenêtre

Récupérer efficacement des valeurs de colonne spécifiques en fonction de la valeur maximale d'une autre colonne, tout en regroupant par une troisième, est facilement réalisé dans Oracle SQL à l'aide des fonctions de fenêtre. Cette approche offre des avantages en matière d'élégance et de performance par rapport aux méthodes alternatives.

Considérez cet exemple de tableau :

KEY NUM VAL
A 1 AB
B 1 CD
B 2 EF
C 2 GH
C 3 HI
D 1 JK
D 3 LM

La solution de fonction de fenêtre

La solution optimale exploite la ROW_NUMBER() fonction de fenêtre :

<code class="language-sql">SELECT key, val
FROM (
  SELECT t.*,
         ROW_NUMBER() OVER (PARTITION BY key ORDER BY num DESC) AS seqnum
  FROM table_name t
) t
WHERE seqnum = 1;</code>

Cette requête donne le résultat suivant :

KEY VAL
A AB
B EF
C HI
D LM

Comment ça marche

  1. La clause OVER (PARTITION BY key ORDER BY num DESC) partitionne les données par la colonne KEY et classe chaque partition par la colonne NUM par ordre décroissant.
  2. ROW_NUMBER() attribue un rang unique à chaque ligne de sa partition. La ligne avec la valeur NUM la plus élevée reçoit le rang 1.
  3. La clause WHERE externe filtre les résultats, ne conservant que les lignes avec seqnum = 1, sélectionnant efficacement la valeur NUM maximale pour chaque KEY.

Différence clé

Un point crucial : contrairement aux méthodes alternatives, l'approche de la fonction de fenêtre garantit une seule ligne par KEY, même si plusieurs lignes partagent la même valeur NUM maximale. Ce comportement peut différer d'autres techniques qui pourraient renvoyer plusieurs lignes dans de tels cas. Si cette distinction est sans importance, la fonction fenêtre offre une solution supérieure de par sa clarté et son efficacité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn