Maison  >  Article  >  base de données  >  Comment trier les enregistrements par date et heure avant de les regrouper dans MySQL ?

Comment trier les enregistrements par date et heure avant de les regrouper dans MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-30 06:24:28593parcourir

How to Sort Records by Date and Time Before Grouping in MySQL?

Trier les enregistrements par date et heure avant de les regrouper dans MySQL

Lorsque vous traitez une table contenant des horodatages, il est essentiel de récupérer des informations basées sur des délais précis. Cependant, trier par date et heure avant de regrouper les enregistrements par un champ spécifique peut poser un défi dans MySQL.

Considérez le tableau suivant :

name    date         time
tom | 2011-07-04 | 01:09:52
tom | 2011-07-04 | 01:09:52
mad | 2011-07-04 | 02:10:53
mad | 2009-06-03 | 00:01:01

Pour récupérer les enregistrements les plus anciens regroupés par nom, la requête suivante échouerait :

SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name

Cette requête ne fonctionne pas car GROUP BY doit apparaître avant ORDER BY. Cependant, le regroupement avant le tri entraîne le renvoi en premier de l'enregistrement « fou » le plus récent au lieu de l'ancien.

Pour surmonter ce problème, plusieurs approches sont disponibles :

Approche de sous-requête :

SELECT * 
FROM (
    SELECT * FROM table_name
    ORDER BY date ASC, time ASC 
) AS sub
GROUP BY name

Cette méthode crée une sous-requête qui trie les enregistrements par date et heure, puis transmet les résultats à la requête externe pour les regrouper par nom. Puisque GROUP BY opère sur le premier enregistrement correspondant dans la sous-requête, il récupère l'enregistrement le plus ancien pour chaque nom.

ROW_NUMBER() Approche :

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date, time) AS row_num
    FROM table_name
) AS sub
WHERE row_num = 1

ROW_NUMBER( ) attribue un numéro séquentiel à chaque ligne de chaque partition de nom, trié par date et heure. En sélectionnant uniquement les enregistrements avec row_num = 1, l'enregistrement le plus ancien pour chaque nom est choisi.

Approche de sous-requête MAX() :

SELECT *
FROM table_name
WHERE (date, time) IN (
    SELECT MAX(date) AS date, MAX(time) AS time
    FROM table_name
    GROUP BY name
)

Cette requête utilise un sous-requête pour sélectionner la date et l’heure maximales pour chaque nom. En filtrant la requête principale en fonction de ces valeurs, elle récupère l'enregistrement le plus ancien pour chaque nom.

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!

Déclaration:
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