Maison > Questions et réponses > le corps du texte
P粉6383439952023-08-24 09:47:12
Ma préférence est d'utiliser le moins de code possible...
Vous pouvez le faire en utilisant IN
Essayez ceci :
SELECT * FROM t1 WHERE (id,rev) IN ( SELECT id, MAX(rev) FROM t1 GROUP BY id )
À mon avis, c'est moins complexe... plus facile à lire et à maintenir.
P粉5174756702023-08-24 09:16:15
Tout ce dont vous avez besoin est une clause avec MAX
聚合函数的 GROUP BY
:
SELECT id, MAX(rev) FROM YourTable GROUP BY id
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 :
group-identifier, max-value-in-group
jointure de sous-requêteDans cette approche, vous trouvez d'abord group-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 sur
max-value-in-group
: SELECT a.id, a.rev, a.contents FROM YourTable a INNER JOIN ( SELECT id, MAX(rev) rev FROM YourTable GROUP BY id ) b ON a.id = b.id AND a.rev = b.rev
group-identifier
Dans cette méthode, vous rejoignez la table avec elle-même. L'égalité existe en
NULL
(这是一个 LEFT JOIN
Lorsque vous effectuez l'étape 1, la ligne qui a réellement la plus grande valeur apparaîtra à droite Vous vous retrouvez donc avec :
SELECT a.* FROM YourTable a LEFT OUTER JOIN YourTable b ON a.id = b.id AND a.rev < b.rev WHERE b.id IS NULL;
Les deux méthodes apporteront exactement les mêmes résultats.
group-identifier
具有 max-value-in-group
Si vous avez deux lignes
max-value-in-group
, les deux lignes apparaîtront dans les résultats des deux méthodes. Les deux méthodes sont compatibles SQL ANSI, elles fonctionneront donc avec votre SGBDR préféré quelle que soit sa « saveur ».
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. 🎜