Maison >base de données >tutoriel mysql >Comment sélectionner efficacement les valeurs les plus récentes pour chaque clé dans une table de base de données ?

Comment sélectionner efficacement les valeurs les plus récentes pour chaque clé dans une table de base de données ?

DDD
DDDoriginal
2024-12-31 20:25:191018parcourir

How to Efficiently Select the Most Recent Values for Each Key in a Database Table?

Sélection des valeurs les plus récentes pour chaque clé dans une table de base de données

Lorsque vous travaillez avec des tables contenant des données de capteur ou d'autres informations horodatées, il Il est souvent nécessaire de récupérer les entrées les plus récentes pour chaque valeur de clé individuelle. Bien qu'une approche simple impliquant le regroupement par clé et le classement par horodatage maximum puisse sembler intuitive, elle peut entraîner des erreurs dues à l'inclusion de champs non clés dans l'agrégation.

Solution alternative utilisant une sous-requête :

Une méthode fiable résout ce problème en utilisant une sous-requête pour identifier l'horodatage maximum pour chaque clé value :

SELECT sensorID,
       timestamp,
       sensorField1,
       sensorField2
FROM sensorTable
WHERE timestamp = (SELECT MAX(timestamp) FROM sensorTable WHERE sensorID = sensorTable.sensorID)
ORDER BY sensorID, timestamp;

Dans cette requête :

  • La table principale sensorTable est consultée deux fois.
  • La sous-requête interne récupère l'horodatage maximum (MAX(timestamp) ) pour chaque sensorID et le compare à l'horodatage correspondant de la table principale.
  • Lignes avec le plus récent les horodatages sont sélectionnés pour chaque valeur clé.
  • Les colonnes récupérées incluent le sensorID, l'horodatage, sensorField1 et sensorField2.

Solution supplémentaire utilisant JOIN :

Une solution alternative utilise un JOIN opération :

SELECT
    s1.sensorID,
    s1.timestamp,
    s1.sensorField1,
    s1.sensorField2
FROM sensorTable AS s1
JOIN (
    SELECT sensorID, MAX(timestamp) AS max_timestamp
    FROM sensorTable
    GROUP BY sensorID
) AS s2
    ON s1.sensorID = s2.sensorID AND s1.timestamp = s2.max_timestamp;
  • Cette requête crée une table temporaire (s2) contenant le maximum d'horodatages pour chaque sensorID.
  • s1 (table principale) est jointe à s2 sur le sensorID et colonnes d'horodatage pour sélectionner les lignes les plus récentes pour chaque valeur clé.

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