Obtenir efficacement des données basées sur la valeur maximale de la colonne concernée
Dans les scénarios où vous devez récupérer une valeur de colonne spécifique basée sur la valeur maximale de la colonne associée et regroupée par une troisième colonne, SQL fournit une solution optimisée. Considérez le tableau suivant, qui contient des données pour 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 |
Le but est de récupérer les résultats suivants à partir de ces données :
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Bien que la requête fournie dans la question obtienne ce résultat, il existe une manière plus élégante d'utiliser 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>
Cette requête partitionne efficacement les lignes en fonction de la colonne KEY et attribue des numéros de ligne par ordre décroissant seqnum
dans chaque partition. En sélectionnant les lignes où seqnum
est égal à 1, on obtient le résultat souhaité et conserve le regroupement souhaité.
Il convient de noter que cette méthode diffère légèrement de la requête d'origine dans la mesure où elle renvoie toujours une ligne par clé, alors que la requête d'origine peut renvoyer plusieurs lignes. Si ce comportement est souhaité, rank()
ou dense_rank()
peut être utilisé à la place 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!