Oracle SQL : Extraction de valeurs liées aux valeurs maximales de colonnes au sein des groupes
Une tâche courante de base de données consiste à sélectionner des valeurs associées à la valeur maximale d'une colonne, en particulier lorsqu'il s'agit de données groupées. Considérons un tableau avec les colonnes KEY
, NUM
et VAL
:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
L'objectif est de trouver le maximum NUM
pour chaque KEY
et son VAL
correspondant. Le résultat souhaité :
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Une méthode utilise une sous-requête :
<code class="language-sql">select KEY, VAL from TABLE_NAME TN where NUM = ( select max(NUM) from TABLE_NAME TMP where TMP.KEY = TN.KEY );</code>
Cependant, une approche plus efficace et plus lisible utilise la fonction ROW_NUMBER()
:
<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>
Cela attribue un classement au sein de chaque KEY
groupe en fonction de valeurs NUM
décroissantes. La clause WHERE
filtre ensuite le premier rang (seqnum = 1
), donnant le résultat souhaité :
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Bien que les deux méthodes aboutissent au même résultat, l'approche ROW_NUMBER()
offre généralement de meilleures performances et une meilleure clarté, en particulier avec des ensembles de données plus volumineux. Le choix optimal dépend des besoins et des préférences spécifiques, mais ROW_NUMBER()
offre une solution robuste et élégante à ce problème SQL courant.
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!