Собирать агрегированные данные на каждый n-й час

89
12

У меня есть некоторые данные, созданные во время. Я использовал следующий запрос, чтобы подсчитать количество "взаимодействий", которое происходило каждый час.

SELECT COUNT(*) as Quantity, FORMAT(cast(InteractionDate as datetime2), 'yyyy-MM-dd HH')  as Datum
FROM Interaction as in
INNER JOIN Mission as mi
on in.MissionID=mi.MissionID
WHERE InteractionDate between '2015-01-13 12' AND '2015-01-22 12'
GROUP BY FORMAT(cast(InteractionDate as datetime2), 'yyyy-MM-dd HH')
ORDER BY Datum

Вышеприведенный запрос дает мне следующее:

116 | 2015-01-15 00 
37 | 2015-01-15 01
17 | 2015-01-15 02

Теперь я хочу получить агрегированное количество взаимодействий на каждый n-й час. Скажем, я хочу каждые 3 часа, за предоставленные данные я бы получил:

170 | 2015-01-15 02

Как я могу это сделать?

спросил(а) 2021-01-25T13:45:21+03:00 4 месяца, 3 недели назад
1
Решение
107

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

group by datediff(hour, '1990-01-01T00:00:00', yourDatetime) / 3

Математика: получите целое число часов от базовой даты и сделайте целочисленное деление на 3, что дает группы из 3 последовательных часов с тем же результатом. И затем он используется для группировки данных.

Это позволит получить количество часов от базовой даты-времени, которую вы хотите указать. В этом случае единственная важная часть - это временная часть, которая позволяет вам решить начальную точку для трехчасовых интервалов. В этом случае интервалы [00:00 to 03:00], [03:00 to 06:00] и т.д. Если вам нужны разные интервалы, сделайте другую базовую дату-время, например '1990-01-01T00:01:00' даст вам интервалы с [01:00 to 04:00], [04:00 to 07:00] и т.д.

Чтобы получить дополнительную информацию, см. Полный ответ: Group DateTime - 5,15,30 и 60-минутные интервалы

В этом ответе вы увидите, как вы можете показать дату и время начала и окончания каждого интервала, кроме агрегированных значений. И более глубокое понимание этого решения.

ответил(а) 2021-01-25T13:45:21+03:00 4 месяца, 3 недели назад
45

Вы можете группировать по дате и часу отдельно, это позволит вам иметь часовые выражения. Например;

GROUP BY cast(InteractionDate as date), (hour(InteractionDate)/4)

Это даст вам полночь до 6 утра в первом ведре, с 6 утра до полудня в следующем и т.д.

ответил(а) 2021-01-25T13:45:21+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема