#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 мог бы сделать — в этом случае похоже на то, чтобы взбивать пудинг.