Extraction de la VAL la plus élevée pour chaque clé dans Oracle SQL
Ce guide montre comment récupérer efficacement le maximum VAL
pour chaque KEY
dans les données groupées à l'aide d'Oracle SQL. Examinons un scénario courant :
Une table nommée TABLE_NAME
contient les données suivantes :
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 générer un ensemble de résultats affichant uniquement le maximum VAL
pour chaque KEY
unique :
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Solution Oracle SQL efficace (10g et versions ultérieures) :
Bien que les sous-requêtes puissent y parvenir, une solution plus élégante et souvent plus rapide utilise la ROW_NUMBER()
fonction analytique :
<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 attribue d'abord un rang (seqnum
) à chaque ligne de chaque KEY
partition, classé par NUM
par ordre décroissant. Ensuite, il filtre les résultats pour inclure uniquement les lignes avec seqnum = 1
, en sélectionnant efficacement la ligne avec le NUM
le plus élevé (et donc, implicitement, le VAL
le plus élevé en supposant une relation cohérente entre NUM
et VAL
au sein de chaque clé).
Remarque importante : Cette méthode garantit une ligne par KEY
. Si vous devez gérer les liens potentiels dans NUM
différemment (par exemple, renvoyer plusieurs lignes pour un KEY
si plusieurs lignes partagent le maximum NUM
), envisagez d'utiliser RANK()
ou DENSE_RANK()
au lieu de ROW_NUMBER()
.
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!