Групування записів на основі інтервалів часу


12

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

Схема

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

Відповіді:


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-Дані

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кінцевому підсумку з DateTime тільки з хвилин.

Це 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))

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' 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.