Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL GROUP BY DateTime +/- 3 sekundy

Korzystam ze świetnego pomysłu Toma H., ale tutaj robię to trochę inaczej:

Zamiast znajdować wszystkie wiersze, które są początkiem łańcuchów, możemy znaleźć wszystkie czasy to są początki łańcuchów, a następnie wróć i znajdź wiersze pasujące do czasów.

Zapytanie nr 1 powinno powiedzieć Ci, które czasy są początkiem łańcuchów poprzez znalezienie, które czasy nie mają żadnych czasów pod nimi, ale w ciągu 3 sekund:

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

A następnie dla każdego wiersza możemy znaleźć największy znacznik czasu początku łańcucha, który jest mniejszy niż nasz znacznik czasu za pomocą zapytania nr 2:

SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
FROM Table
JOIN ([query #1]) StartofChains
ON Table.Timestamp >= StartOfChains.TimeStamp
GROUP BY Table.id

Gdy już to mamy, możemy GRUPOWAĆ WEDŁUG, jak chcesz.

SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime

Nie jestem do końca pewien, czy różni się to wystarczająco od odpowiedzi Toma H, aby opublikować ją osobno, ale brzmiało to, jakbyś miał problem z implementacją i zastanawiałem się nad tym, więc pomyślałem, że opublikuję ponownie. Powodzenia!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pobrać 2 razy w MYSQL PDO bez FETCHALL

  2. mysql na liście sprawdza tylko pierwszy identyfikator na liście. może problem z kropelką

  3. Środowisko pracy MySQL

  4. Prześlij wiele obrazów i zapisz ich ścieżkę w bazie danych

  5. mysql wybierz identyfikator i nazwę z innej tabeli i dołącz do zapytania