Группировать по диапазону дат

#sql #sql-server #datetime

#sql #sql-сервер #дата-время

Вопрос:

Я прочитал несколько тем о группировке по последовательности, но я не смог найти решение своей проблемы.

У меня есть таблица (имя ViewHistory ), подобная этой.

 Tme                         Value
2020-07-22 09:30:00         1
2020-07-22 09:31:00         2
2020-07-22 09:32:00         3
2020-07-22 09:33:00         4
2020-07-22 09:34:00         5
2020-07-22 09:35:00         6
.
.
.
 

Данные могут расти бесконечно.

В этой таблице много записей с 1 min временными рамками.

Я хочу сгруппировать по диапазону времени данных с таймфреймом 2 min и Sum(value) . как этот вывод:

 TimeFrame   SumData
09:30       1
09:32       5 -- sum of range 09:31_09:32
09:34       9 -- sum of range 09:33_09:34
.
.
.
 

Как я могу сделать это автоматически, вместо использования:

WHERE Tme BETWEEN ('2020-07-22 09:31:00' AND '2020-07-22 09:32:00') и т.д.

Ответ №1:

Я уверен, что есть более простой способ, но он не приходит ко мне прямо сейчас.

 declare @Test table (tme datetime2, [value] int)

insert into @Test (tme, [value])
values
('2020-07-22 09:30:00',         1),
('2020-07-22 09:31:00',         2),
('2020-07-22 09:32:00',         3),
('2020-07-22 09:33:00',         4),
('2020-07-22 09:34:00',         5),
('2020-07-22 09:35:00',         6);

with cte as (
  select convert(date, tme) [date], datepart(hour, tme) [hour], datepart(minute,dateadd(minute, 1,tme)) / 2 [minute], sum([value]) [value]
  from @Test
  group by convert(date, tme), datepart(hour, tme), datepart(minute,dateadd(minute, 1,tme)) / 2
)
select convert(varchar(2),[hour])   ':'   convert(varchar(2), [minute] * 2) [time], [value]
  -- , dateadd(minute, [minute] * 2, dateadd(hour, [hour], convert(datetime2, [date]))) -- Entire date if desired
from cte;
 

Что дает:

время значение
9:30 1
9:32 5
9:34 9
9:36 6

Комментарии:

1. спасибо @Dale K, это кажется очень близким к ответу, пожалуйста, сверьте свой результат с моим выводом.

2. CROSS APPLY вычисление, поэтому вам не нужно писать его дважды.

3. @Charlieface мог бы сделать — в этом случае похоже на то, чтобы взбивать пудинг.