Maison > base de données > tutoriel mysql > Comment récupérer les dernières informations à l'aide de « GROUP BY » et « MAX » de SQL (ou d'alternatives) ?

Comment récupérer les dernières informations à l'aide de « GROUP BY » et « MAX » de SQL (ou d'alternatives) ?

Barbara Streisand
Libérer: 2024-12-26 02:38:11
original
339 Les gens l'ont consulté

How to Retrieve the Latest Information Using SQL's `GROUP BY` and `MAX` (or Alternatives)?

Récupération des dernières informations à l'aide de SQL Group By & Max

Dans certains scénarios, il devient nécessaire de récupérer les valeurs les plus récentes ou maximales regroupées par colonnes spécifiques dans un ensemble de données. L'une de ces agrégations courantes consiste à rechercher les informations les plus récentes pour des combinaisons uniques de valeurs.

Considérez le tableau suivant contenant une liste d'alarmes :

id name alarmId alarmUnit alarmLevel
1 test voltage psu warning
2 test voltage psu ceasing
3 test voltage psu warning
4 test temp rcc warning
5 test temp rcc ceasing

L'objectif est de récupérer uniquement les alarmes les plus récentes. informations pour chaque combinaison de alarmId et alarmUnit. Le résultat attendu devrait se présenter comme suit :

id name alarmId alarmUnit alarmLevel
3 test voltage psu warning
5 test temp rcc ceasing

Plusieurs approches peuvent être utilisées pour atteindre ce résultat. Une méthode courante implique l'utilisation de la fonction ROW_NUMBER(), qui attribue un rang à chaque ligne de chaque groupe. La requête suivante tire parti de cette fonction :

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY alarmId, alarmUnit ORDER BY id DESC) AS rn
    FROM mytable
) q
WHERE rn = 1
Copier après la connexion

Cette requête renvoie la ligne la plus récente pour chaque combinaison de alarmId et alarmUnit.

Pour les bases de données qui ne prennent pas en charge la fonction ROW_NUMBER() , comme MySQL, une approche différente peut être utilisée :

SELECT mi.*
FROM (
    SELECT alarmId, alarmUnit, MAX(id) AS mid
    FROM mytable
    GROUP BY alarmId, alarmUnit
) mo
JOIN mytable mi
ON mi.id = mo.mid
Copier après la connexion

Cette requête utilise une sous-requête pour identifier l'identifiant maximum pour chaque combinaison de alarmId et alarmUnit, puis joint le résultat à la table d'origine pour récupérer les lignes correspondantes.

Dans les versions PostgreSQL 8.3 et inférieures, la clause DISTINCT ON peut être utilisée :

SELECT DISTINCT ON (alarmId, alarmUnit) *
FROM mytable
ORDER BY alarmId, alarmUnit, id DESC
Copier après la connexion

Ceci La requête renvoie la première ligne distincte pour chaque combinaison de alarmId et alarmUnit, ce qui fournit effectivement les dernières informations. En exploitant ces techniques, les développeurs peuvent récupérer efficacement les valeurs les plus récentes de leurs données, leur permettant ainsi de prendre des décisions éclairées basées sur les dernières informations disponibles.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal