MySQL группа с разницей во времени

0

Мои записи в таблице:

id         startFrom                   endOn               gateway   broadcast
1    2018-09-01T23:41:24:024  2018-09-01T23:45:24:028         A         X01
2    2018-09-01T23:41:24:025  2018-09-01T23:45:24:032         A         X01
3    2018-09-01T23:41:24:026  2018-09-01T23:45:24:028         B         X01
4    2018-09-01T23:41:24:030  2018-09-01T23:45:24:045         C         X01
5    2018-09-01T22:41:24:029  2018-09-01T23:41:24:784         B         X02
6    2018-09-01T23:41:24:025  2018-09-01T23:45:24:038         A         X01

Если я хочу использовать один запрос для поиска первого периода запроса запроса в каждом шлюзе в конкретной широковещательной передаче. Как использовать MySQL для группировки запроса?

Не удалось:

SELECT gateway, TIMESTAMPDIFF(MICROSECOND, 'startFrom', 'endOn') AS 'timeDiff' FROM Records WHERE broadcast = 'X01' GROUP BY gateway

И если я попытаюсь создать временную таблицу, например:

SELECT gateway, MIN(timeDiff)
FROM (SELECT TIMESTAMPDIFF(MICROSECOND, 'startFrom', 'endOn') AS 'timeDiff', gateway, broadcast FROM Records) t
WHERE broadcast = 'X01'
GROUP BY gateway;

Он получает только минимальный промежуток времени от записей каждого шлюза в этой широковещательной передаче, но мне приходится запрашивать разницу времени "первая запись" (=> ORDER BY startFrom ASC).

Конечный результат:

gateway        startFrom                 endOn                 timeDiff
A       2018-09-01T23:41:24:024  2018-09-01T23:45:24:028         4000  
B       2018-09-01T23:41:24:026  2018-09-01T23:45:24:028         2000  
C       2018-09-01T23:41:24:030  2018-09-01T23:45:24:045         15000  

Спасибо за чтение и помощь

  • 0
    Пожалуйста, поделитесь ожидаемым результатом
  • 0
    Если у вас два или более значения startFrom одинаковы (например, id 1,2) для шлюза, хотите ли вы оба или конкретное?
Показать ещё 3 комментария
Теги:
database
group-by

4 ответа

0

Вы можете попробовать что-то вроде ниже,

DROP TABLE IF EXISTS groupTime ;
CREATE TABLE groupTime (
id INT(11) AUTO_INCREMENT PRIMARY KEY,
startFrom DATETIME(3),
endOn DATETIME(3),
gateway CHAR(1),
broadcast VARCHAR(8)
);

INSERT INTO groupTime (startFrom,endOn,gateway ,broadcast)
VALUES
('2018-09-01 23:41:24.024','2018-09-01 23:45:24.028','A','X01'),
('2018-09-01 23:41:24.025','2018-09-01 23:45:24.032','A','X01'),
('2018-09-01 23:41:24.026','2018-09-01 23:45:24.028','B','X01'),
('2018-09-01 23:41:24.030','2018-09-01 23:45:24.045','C','X01'),
('2018-09-01 23:41:24.029','2018-09-01 23:41:24.784','B','X02'),
('2018-09-01 23:41:24.025','2018-09-01 23:45:24.038','A','X01');


SELECT a.gateway, a.startfrom, a.endOn , TIMESTAMPDIFF(MICROSECOND , a.startfrom, a.endOn) FROM groupTime a 
INNER JOIN (
    SELECT MIN(id) AS id FROM groupTime WHERE broadcast='X01' GROUP BY gateway 
)AS b
ON a.id = b.id

демонстрация

0

Попробуй это:

select gateway, min(startFrom),min(endOn), TIMESTAMPDIFF(MICROSECOND, min(startFrom), min(endOn)) AS 'timeDiff' 
from records
where broadcast = 'X01' GROUP BY gateway
  • 0
    Поскольку запросы, отправленные параллельно, а не последовательные, в моих случаях не могут использовать endOn для заказа
  • 0
    почему вам нужен эндон в порядке?
Показать ещё 1 комментарий
0

Предполагая, что вы хотите первым для каждого шлюза и трансляции, используйте это:

select gateway, broadcast, timeDiff from (
    SELECT gateway, broadcast, TIMESTAMPDIFF(MICROSECOND, startFrom, endOn) AS timeDiff,
        row_number() over (partition by gateway, broadcast order by startfrom) as rn
    FROM Records ) q
where rn=1

EDIT: просмотр документа mySQL версии 8, синтаксис отличается

select gateway, broadcast, timeDiff from (
    SELECT gateway, broadcast, TIMESTAMPDIFF(MICROSECOND, startFrom, endOn) AS timeDiff,
        row_number() over w as rn
    FROM Records
    WINDOW w as (partition by gateway, broadcast order by startfrom)
) q
where rn=1
  • 1
    Похоже, что MySQL не имеет чрезмерного разделения на разделы: '(
  • 0
    Извиняюсь. Но в соответствии с документом он делает то же самое - я добавлю
Показать ещё 2 комментария
0

выберите * из записей;
+ ---- + --------------------- + --------------------- + --------- + ----------- +
| id | startFrom | endOn | шлюз | трансляция |
+ ---- + --------------------- + --------------------- + --------- + ----------- +
| 1 | 2018-09-17 05:23:53 | 2018-09-17 06:23:53 | A | X01 |
| 2 | 2018-09-17 05:24:08 | 2018-09-17 06:24:08 | A | X01 |
| 3 | 2018-09-17 05:24:25 | 2018-09-17 06:24:25 | B | X01 |
| 4 | 2018-09-17 05:24:32 | 2018-09-17 06:24:32 | C | X01 |
| 5 | 2018-09-17 05:24:42 | 2018-09-17 07:24:42 | B | X02 |
+ ---- + --------------------- + --------------------- + --------- + ----------- +

и это тот запрос, который вы ищете.

выберите gateway, startFrom, endOn, time_to_sec (timediff (endOn, startFrom)) как timeDiff из группы записей по шлюзу asc;
+ --------- + --------------------- + ----------------- ---- + ---------- +
| шлюз | startFrom | endOn | timeDiff |
+ --------- + --------------------- + ----------------- ---- + ---------- +
| A | 2018-09-17 05:23:53 | 2018-09-17 06:23:53 | 3600 |
| B | 2018-09-17 05:24:25 | 2018-09-17 06:24:25 | 3600 |
| C | 2018-09-17 05:24:32 | 2018-09-17 06:24:32 | 3600 |
+ --------- + --------------------- + ----------------- ---- + ---------- +

Ещё вопросы

Сообщество Overcoder
Наверх
Меню