Группировка записей по интервалам времени

12

У меня есть таблица со следующей схемой, и мне нужно определить запрос, который может группировать данные на основе интервалов времени ( например, записей в минуту ), а затем предоставлять сумму изменений в SnapShotValue со времени предыдущей группы. В настоящее время SnapShotValue всегда увеличивается, поэтому мне нужна только сумма разностей. Может ли кто-нибудь помочь с запросом SQL Server T-SQL, который может сделать это? Я открыт для изменения схемы, но это то, что у меня сейчас есть.

схема

CaptureTime   (datetime)
SnapShotValue (int)

Пример данных

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500

Желаемый результат запроса

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured data changes up to the 2 minute mark
1 Jan 2012 00:03:00,   125 -- Sum of all captured data changes up to the 3 minute mark
JoeGeeky
источник

Ответы:

17
select dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0),
       sum(SnapShotValue)
from YourTable
group by dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)

SE-Data

datediff(minute, 0, CaptureTime)дает вам количество минут с тех пор 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)добавляет количество минут, начиная с даты и времени 1900-01-01T00:00:00и 1900-01-01T00:00:00заканчивая только минутами.

Это 1+потому, что вы хотели в следующую минуту.

Чтобы сделать то же самое с 5-минутным интервалом, вам нужно сделать некоторые расчеты. Разделите минуты на 5и умножьте их, чтобы 5получить минуты, округленные до 5 минут. Это работает, потому что результатом целочисленного деления в SQL Server является целое число.

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)
Микаэль Эрикссон
источник
Это обеспечило хорошую основу для ответа, но у меня все еще есть небольшие проблемы с пониманием, как это работает. Когда я пытался изменить смещение с 1-минутного интервала на 5-минутный интервал, я все равно получал 1-минутный интервал, причем весь результат начинался с другой начальной точки. Это очень вероятно, потому что я неправильно понимаю, как это работает. Не могли бы вы предоставить еще один образец, показывающий интервал, отличный от 1 минуты? Спасибо ...
JoeGeeky
0

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

select dateadd(minute,1,convert(varchar(20),capturetime)), sum(snapshotvalue)
from snapshotdata sd
group by dateadd(minute,1,convert(varchar(20),capturetime))
WT_W
источник
0

Ниже приведен перевод принятого ответа в PostgreSQL (в качестве базовой даты я выбрал 1 января 2000 года. Измените его на более раннюю, если ваши данные старше этой):

SELECT 
  TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
  , SUM(SnapShotValue)
FROM table_name
GROUP BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
ORDER BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
LoMaPh
источник