MySQL подсчитывает количество строк, где время составляет х секунд - PullRequest
0 голосов
/ 17 октября 2019

У меня есть таблица базы данных (raw_data), где есть несколько строк. Я рассчитываю подсчитать количество строк между заданным интервалом времени (9:25:00 и 9:29:59) путем группировки строк, если разница во времени между каждой строкой меньше или равна 2 секундам.

Например:

EventId Date    Time
1   2019/10/16  9:27:08
2   2019/10/16  9:27:11
3   2019/10/16  9:27:37
4   2019/10/16  9:27:40
5   2019/10/16  9:27:45
6   2019/10/16  9:27:45
7   2019/10/16  9:27:45
8   2019/10/16  9:27:57

данные в этом фрагменте должны давать счет 6 (при подсчете элементов, которые находятся на расстоянии менее 2 секунд друг от друга). Т.е., если элемент находится менее чем в 2 секундах от следующей строки, скорее всего, это одно и то же событие и, следовательно, оно сгруппировано.

Очень ценится

Были попытки выполнить запросы вроде: (найдено по адресу: MySQL группирует результаты по периодам времени )

SELECT count(*)
FROM
(
    SELECT a.starttime AS ThisTimeStamp, MIN(b.starttime) AS NextTimeStamp
    FROM raw_data a
    INNER JOIN raw_data b
    ON a.starttime < b.starttime
        and a.startdate = b.startdate
        where a.startdate ='2019-10-16' 
        and a.starttime >= '09:27:00' and a.starttime < '09:28:00' 
        and b.startdate ='2019-10-16' 
        and b.starttime >= '09:27:00' and b.starttime < '09:28:00' 
    GROUP BY a.starttime
) Sub1
WHERE Sub1.ThisTimeStamp < (Sub1.NextTimeStamp - 2) 

целенаправленно жестко кодирует даты и время и сравнивает результаты вручную, но результат всегда будет отличаться от ручного подсчета.

1 Ответ

1 голос
/ 18 октября 2019

С этой таблицей.

CREATE TABLE table2
    (`EventId` int, `Date` date, `Time` time)
;

INSERT INTO table2
    (`EventId`, `Date`, `Time`)
VALUES
    (1, '2019-10-16', '9:27:08'),
    (2, '2019-10-16, '9:27:11'),
    (3, '2019-10-16, '9:27:37'),
    (4, '2019-10-16, '9:27:40'),
    (5, '2019-10-16, '9:27:45'),
    (6, '2019-10-16, '9:27:45'),
    (7, '2019-10-16', '9:27:45'),
    (8, '2019-10-16', '9:27:57')
;

И с этим оператором выбора

SELECT
  EventId,`Date`, `Time`
FROM
  (Select 
    EventId,`Date`, `Time`
    ,if (TIMESTAMPDIFF(SECOND,@date_time,STR_TO_DATE(CONCAT(`Date`, ' ', `Time`), '%Y-%m-%d %H:%i:%s') ) > 2
    ,1,-1) inintrvall
    ,@date_time := STR_TO_DATE(CONCAT(`Date`, ' ', `Time`), '%Y-%m-%d %H:%i:%s') 
  From table2,
    (SELECT @date_time:= (SELECT min(STR_TO_DATE(CONCAT(`Date`, ' ', SUBTIME( `Time`, "5")), '%Y-%m-%d %H:%i:%s') ) 
    FROM table2)) ti
  order by `Date` ASC, `Time` ASC) t1
WHERE inintrvall = 1
 order by `Date` ASC, `Time` ASC;

Вы получите 6 строк

EventId     Date        Time
1           2019-10-16  09:27:08
2           2019-10-16  09:27:11
3           2019-10-16  09:27:37
4           2019-10-16  09:27:40
5           2019-10-16  09:27:45
8           2019-10-16  09:27:57

Группировка по не будет работать вовремяintervalls.

так что этот маленький алгоритм. Я проверяю каждую строку, если предыдущая строка имеет дату и время старше 2 секунд. Затем она помечает ее 1, а если нет, то -1.

Уродливая часть состоит в том, чтобы получить фактическую дату и время, чтобы лучше рассчитать разницу во времени. Например, когда начинается новый день.

Для этих целей было бы лучше сохранить директиву как метку времени или дату / время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...