MySQL GROUP BY DateTime avec une précision de /- 3 secondes
Énoncé du problème
Énoncé du problème un tableau avec des colonnes pour l'ID, l'horodatage et le titre, l'objectif est de regrouper les enregistrements qui se produisent à moins de 3 secondes les uns des autres. Dans ce scénario, les lignes avec les horodatages 15:00:00 et 15:00:02 seraient regroupées.
Solution
Au lieu d'identifier les débuts des chaînes basées sur des lignes individuelles, concentrons-nous sur le chaînage des horodatages.
Requête 1 : Déterminer les horodatages de début de chaîne
<code class="mysql">SELECT DISTINCT Timestamp FROM Table a LEFT JOIN Table b ON (b.Timestamp >= a.Timestamp - INTERVAL 3 SECONDS AND b.Timestamp < a.Timestamp) WHERE b.Timestamp IS NULL
Cette requête renvoie les horodatages qui n'ont aucun horodatage au-dessus d'eux dans 3 secondes, indiquant le début des chaînes.
Requête 2 : associer des enregistrements aux horodatages de début de chaîne
<code class="mysql">SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime FROM Table JOIN ([query #1]) StartOfChains ON Table.Timestamp >= StartOfChains.TimeStamp GROUP BY Table.id</code>
Pour chaque ligne, cette requête identifie la plus grande chaîne -horodatage de début (se produisant avant l'horodatage de la ligne).
Opération GROUP BY finale
<code class="mysql">SELECT COUNT(*) --or whatever FROM Table JOIN ([query #2]) GroupingQuery ON Table.id = GroupingQuery.id GROUP BY GroupingQuery.ChainStartTime</code>
Cette requête utilise la table GroupingQuery de la requête 2 pour regrouper les enregistrements en fonction de la colonne ChainStartTime, permettant des calculs agrégés au sein de chaque groupe horaire.
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!