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 ?
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
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.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.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!