Maison > Questions et réponses > le corps du texte
P粉9094764572023-08-22 12:49:52
Je préfère utiliser le moins de code possible...
Vous pouvez utiliser IN
pour réaliser
Essayez ceci :
SELECT * FROM t1 WHERE (id,rev) IN ( SELECT id, MAX(rev) FROM t1 GROUP BY id )
À mon avis, c'est plus simple... plus facile à lire et à maintenir.
P粉2873452512023-08-22 09:59:35
Il vous suffit d'utiliser la 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 la ligne entière de données avec la valeur maximale dans une colonne en fonction d'un certain identifiant de regroupement. J'ai beaucoup entendu cette question au cours de ma carrière. En fait, c'est l'une des questions auxquelles j'ai répondu lors d'un entretien technique à mon emploi actuel.
Cette question est en fait si courante que la communauté Stack Overflow a créé une balise spécifiquement pour traiter ce type de question : greatest-n-per-group.
En gros, vous avez deux manières de résoudre ce problème :
group-identifier, max-value-in-group
sous-requêteDans cette approche, vous trouvez d'abord group-identifier, max-value-in-group
(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifier
和max-value-in-group
dans une sous-requête (déjà résolue ci-dessus). Vous joignez ensuite votre table avec la sous-requête, en utilisant
max-value-in-group
pour une équijointure : 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 approche, vous effectuez une jointure gauche de la table avec elle-même. L'équijointure est effectuée le
NULL
(记住,这是一个LEFT JOIN
)。然后,我们过滤连接结果,只显示右侧为NULL
Lorsque vous effectuez l'étape 1, la ligne qui a réellement la plus grande valeur aura la ligne 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 résultats obtenus par ces deux méthodes sont exactement les mêmes.
group-identifier
有两行具有max-value-in-group
S'il y a deux lignes avec max-value-in-group
pour
Les deux méthodes sont compatibles SQL ANSI, donc quelle que soit la « saveur » du SGBDR que vous préférez, vous pouvez l'utiliser.
Les deux méthodes sont également respectueuses des performances, mais votre situation réelle peut être différente (SGBDR, structure de base de données, index, etc.). Alors lorsque vous choisissez l'une de ces méthodes, faites du benchmark
. Et assurez-vous de choisir la méthode qui vous convient le mieux. 🎜