MySql GROUP BY timestamp интервал, где интервал прошел - PullRequest
0 голосов
/ 28 августа 2018

Можно ли выбрать только те записи, где прошел интервал?

Например, в select with group by для такой таблицы: TABLE (timestamp(timestamp), name(VARCHAR))

timestamp            name  
-------------------  ----  
2010-11-16 10:30:01  John  
2010-11-16 10:30:02  John  
2010-11-16 10:30:03  John  
2010-11-16 10:30:31  John  
2010-11-16 10:30:32  John  
2010-11-16 10:30:33  John 

Запрос:

SELECT max(timestamp), name, count(name) 
FROM table 
GROUP BY UNIX_TIMESTAMP(timestamp) DIV 30, name

Результат:

timestamp            name       count(name)  
    -------------------  ----   -----------
    2010-11-16 10:30:03  John     3 
    2010-11-16 10:30:33  John     3

Это будет группировать по записям из:

hour:minute:00 to hour:minute:29 и из: hour:minute:30 to hour:minute:59

Если я сделаю запрос на 10:30:55, я хочу получить только записи за предыдущий интервал 10:30:00 до 10:30:29 (и старше) без записей, добавленных между 10:30:30 до 10:30:59.

Другими словами, если я сделаю запрос в течение некоторого интервала, подождите, пока он пройдет, прежде чем показывать записи. Обратите внимание, что запрос может выполняться не всегда в одну и ту же секунду (10:30:55), это может быть 10:30:51 или что-то еще.

Таким образом, результат с предложением должен быть:

        timestamp            name       count(name)  
        -------------------  ----   -----------
        2010-11-16 10:30:03  John     3 

Если оно сделано, например, в 2010-11-16 10:30:55.

1 Ответ

0 голосов
/ 28 августа 2018

SQL DEMO

SELECT max(timestamp), name, count(name) 
FROM table1
WHERE UNIX_TIMESTAMP(timestamp) DIV 30 < 
      UNIX_TIMESTAMP('2010-11-16 10:30:55') DIV 30
GROUP BY UNIX_TIMESTAMP(timestamp) DIV 30, name
;

Я жестко кодирую текущую дату '2010-11-16 10:30:55', но вместо нее можно использовать NOW()

OUTPUT

|       max(timestamp) | name | count(name) |
|----------------------|------|-------------|
| 2010-11-16T10:30:03Z | John |           3 |

Если вам нужна только последняя группа, добавьте

ORDER BY UNIX_TIMESTAMP(timestamp) DIV 30 DESC
LIMIT 1
...