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
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
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
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!