SQL sélectionne uniquement les lignes avec la valeur maximale sur la colonne
P粉937382230
2023-08-23 11:08:57
<p>J'ai ce formulaire de document (voici une version simplifiée) : </p>
<table class="s-table">
<tête>
<tr>
<th>id</th>
<th>Transfert</th>
<th>Contenu</th>
≪/tr>
≪/tête>
<corps>
<tr>
<td>1</td>
<td>1</td>
<td>...</td>
≪/tr>
<tr>
<td>2</td>
<td>1</td>
<td>...</td>
≪/tr>
<tr>
<td>1</td>
<td>2</td>
<td>...</td>
≪/tr>
<tr>
<td>1</td>
<td>3</td>
<td>...</td>
≪/tr>
</tcorps>
</tableau>
<p>Comment sélectionner une ligne par ID et uniquement le RPM le plus élevé ? </p><p>
En utilisant les données ci-dessus, le résultat doit contenir deux lignes : <code>[1, 3, ...]</code> et <code>[2, 1, ..]</code> . J'utilise <em><strong>MySQL</strong></em>. </p>
<p>Actuellement, j'utilise une vérification dans une boucle <code>while</code> pour détecter et écraser les anciennes versions dans le jeu de résultats. Mais est-ce le seul moyen d’arriver à ce résultat ? Vous n'avez pas de solution <strong>SQL</strong> </p>
Ma préférence est d'utiliser le moins de code possible...
Vous pouvez le faire en utilisant
IN
Essayez ceci :À mon avis, c'est moins complexe... plus facile à lire et à maintenir.
À première vue...
Tout ce dont vous avez besoin est une clause avec
MAX
聚合函数的GROUP BY
:Les choses ne sont jamais aussi simples, n'est-ce pas ?
Je viens de remarquer qu'il faut aussi
content
colonnes.Il s'agit d'un problème très courant en SQL : rechercher toutes les données d'une ligne avec une valeur maximale dans chaque colonne d'identifiant de groupe. J’entends souvent cette affirmation au cours de ma carrière. En fait, c'est l'une des questions auxquelles j'ai répondu lors d'un entretien technique dans le cadre de mon emploi actuel.
En fait, la communauté Stack Overflow a créé une balise pour gérer des questions comme celle-ci : greatest-n-per-group.
En gros, vous avez deux manières de résoudre ce problème :
Utilisez une simple
group-identifier, max-value-in-group
jointure de sous-requêteDans cette approche, vous trouvez d'abord
etgroup-identifier, max-value-in-group
(上面已解决)。然后,将表连接到子查询,并在group-identifier
和max-value-in-group
dans la sous-requête (résolue ci-dessus). Ensuite, joignez la table à la sous-requête et rendez-la égale surmax-value-in-group
:group-identifier
Dans cette méthode, vous rejoignez la table avec elle-même. L'égalité existe enNULL
(这是一个LEFT JOIN
Lorsque vous effectuez l'étape 1, la ligne qui a réellement la plus grande valeur apparaîtra à droitegroup-identifier
具有max-value-in-group
Si vous avez deux lignesmax-value-in-group
, les deux lignes apparaîtront dans les résultats des deux méthodes.Les deux approches sont également favorables aux performances, mais votre situation peut différer (SGBDR, structure de base de données, index, etc.). Ainsi, lorsque vous choisissez une méthode plutôt qu'une autre, Benchmark
. Et assurez-vous de choisir celui qui vous convient le mieux. 🎜