Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL GROUP BY DateTime +/- 3 секунди

Използвам отличната идея на Том Х., но тук я правя малко по-различно:

Вместо да намираме всички редове, които са началото на вериги, можем да намерим всички време които са началото на вериги, след това се върнете назад и ако намерете редовете, които отговарят на времената.

Заявка №1 тук трябва да ви каже кои времена са началото на вериги, като откриете кои времена нямат времена под тях, но в рамките на 3 секунди:

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

И след това за всеки ред можем да намерим най-голямото времево клеймо за начало на веригата, което е по-малко от нашето времево клеймо със заявка №2:

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

След като имаме това, можем да ГРУПИРАМ ПО, както желаете.

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

Не съм напълно сигурен, че това се различава достатъчно от отговора на Tom H, за да бъде публикуван отделно, но звучеше така, сякаш имате проблеми с внедряването и аз мислех за това, така че реших да публикувам отново. Успех!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли някаква печалба в производителността при индексирането на булеви полета?

  2. MySQL изчислява плъзгащата се средна стойност на N реда

  3. Какви са разликите между Null, Zero и Blank в SQL?

  4. MySQL IN с LIKE

  5. Прозорец за избор на SQL около определен ред