根据时间间隔对记录进行分组


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

Answers:


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:001900-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 2012年

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(我选择2000年1月1日作为基准日期。如果您的数据早于该日期,请将其更改为较早的日期):

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' 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.