Группировка по диапазону DATETIME - MySql - PullRequest
0 голосов
/ 17 ноября 2018

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

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

enter image description here

Это было бы что-то вроде: SELECT * FROM tabela GROUP BY sinistro, prefixo, data AND horaIfull_oco range 2h

А также в результате необходимо, чтобы столбцы имели все свои идентификаторы если возможно , например: id1, id2 и т.д.Я уже исследовал и ничего не нашел, если кто-нибудь знает, как это сделать.

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018
GROUP BY FLOOR(UNIX_TIMESTAMP(horaIfull_oco) / 7200)

(7200 - 2 часа.)

Если вы хотите получить базовое время для каждой группы:

FROM_UNIXTIME(
   FLOOR(UNIX_TIMESTAMP(horaIfull_oco) / 7200)
              , 7200)

Этот метод можно адаптировать к любой обычнойинтервал времени путем изменения 7200.

0 голосов
/ 26 ноября 2018

Предполагается, что таблица базы данных имеет таблицу со следующей схемой:

CREATE TABLE t1 (
    c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    c2 VARCHAR(100),
    c3 VARCHAR(100),
    c4 DATE,
    c5 TIME,
    c6 DATETIME);

INSERT INTO t1 (c1,c2,c3,c4,c5,c6) 
VALUES 
(1,'DDA1123_12112018','55307','2018-12-11','00:43:00', '2018-12-11 00:43:00'),
(2,'DDA1123_12112018','55307','2018-12-11','00:07:00', '2018-12-11 00:07:00'),
(3,'DDA1124_12112018','55308','2018-12-11','03:07:00', '2018-12-11 03:07:00'),
(4,'DDA1124_12112018','55308','2018-12-11','04:07:00', '2018-12-11 04:07:00'),
(5,'DDA1124_12112018','55308','2018-12-11','07:07:00', '2018-12-11 07:07:00'),
(6,'DDA1125_12112018','55309','2018-12-11','06:07:00', '2018-12-11 06:07:00'),
(7,'DDA1125_12112018','55309','2018-12-11','07:57:00', '2018-12-11 07:57:00'),
(8,'DDA1126_12112018','55310','2018-12-11','08:07:00', '2018-12-11 08:07:00'),
(9,'DDA1127_12112018','55311','2018-12-11','12:07:00', '2018-12-11 12:07:00'),
(10,'DDA1127_12112018','55311','2018-12-11','14:07:00', '2018-12-11 14:07:00'),
(11,'DDA1127_12112018','55311','2018-12-11','17:07:00', '2018-12-11 17:07:00');

В этом случае вы можете использовать CASE ... WHEN в GROUP BY, как в этом примере запроса.

SELECT c1,c2,c3,c4,c5,c6,
CASE TRUE
WHEN HOUR(c6) BETWEEN 0 AND 2 THEN 0 
WHEN HOUR(c6) BETWEEN 2 AND 4 THEN 2 
WHEN HOUR(c6) BETWEEN 4 AND 6 THEN 4 
WHEN HOUR(c6) BETWEEN 6 AND 8 THEN 6
WHEN HOUR(c6) BETWEEN 8 AND 10 THEN 8
WHEN HOUR(c6) BETWEEN 10 AND 12 THEN 10
WHEN HOUR(c6) BETWEEN 12 AND 14 THEN 12
WHEN HOUR(c6) BETWEEN 14 AND 16 THEN 14
WHEN HOUR(c6) BETWEEN 16 AND 18 THEN 16
WHEN HOUR(c6) BETWEEN 18 AND 20 THEN 18
WHEN HOUR(c6) BETWEEN 20 AND 22 THEN 20
WHEN HOUR(c6) BETWEEN 22 AND 24 THEN 22
END AS c7 FROM t1
GROUP BY c7;

Вы можете просмотреть результаты приведенного выше примера в SQL Fiddle .

EDIT

Для лучшего результата приведенный выше запрос можно переписать:

SELECT c1,c2,c3,c4,c5,c6,
CASE TRUE
WHEN HOUR(c6) BETWEEN 0 AND 1 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 0 
WHEN HOUR(c6) BETWEEN 2 AND 3 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 2 
WHEN HOUR(c6) BETWEEN 4 AND 5 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 4 
WHEN HOUR(c6) BETWEEN 6 AND 7 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 6
WHEN HOUR(c6) BETWEEN 8 AND 9 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 8
WHEN HOUR(c6) BETWEEN 10 AND 11 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 10
WHEN HOUR(c6) BETWEEN 12 AND 13 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 12
WHEN HOUR(c6) BETWEEN 14 AND 15 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 14
WHEN HOUR(c6) BETWEEN 16 AND 17 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 16
WHEN HOUR(c6) BETWEEN 18 AND 19 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 18
WHEN HOUR(c6) BETWEEN 20 AND 21 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 20
WHEN HOUR(c6) BETWEEN 22 AND 23 AND MINUTE(c6) BETWEEN 0 AND 59 THEN 22
END AS c7 FROM t1
GROUP BY c7;

Вы можете просмотреть результаты отредактированного примера в этой SQL Fiddle .

0 голосов
/ 17 ноября 2018

Вы можете выбрать floor(hour / 2), который скажет вам, к какому двухчасовому периоду он принадлежит, и сгруппировать по нему вместе с датой:

SELECT *,
    group_concat(id_oco) as grouped_ids,
    floor(HOUR(horaIfull_oco) / 2) AS two_hour
FROM tabela
GROUP BY inclusao_oco, sinistro, prefixo, data, DATE(horaIfull_oco), two_hour
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...