我在一段时间内生成了一些数据。我使用下面的查询来计算每小时发生的“交互”次数。
SELECT COUNT(*) as Quantity, FORMAT(cast(InteractionDate as datetime2), 'yyyy-MM-dd HH') as Datum
FROM Interaction as in
INNER JOIN Mission as mi
on in.MissionID=mi.MissionID
WHERE InteractionDate between '2015-01-13 12' AND '2015-01-22 12'
GROUP BY FORMAT(cast(InteractionDate as datetime2), 'yyyy-MM-dd HH')
ORDER BY Datum
上面的查询给了我:
116 | 2015-01-15 00
37 | 2015-01-15 01
17 | 2015-01-15 02
现在我希望每隔n小时获得一次聚合的交互次数。假设我想要每隔3小时,因为我会得到的数据:
170 | 2015-01-15 02
我该怎么做?
答案 0 :(得分:0)
您可以分别按日期和小时进行分组,这样您就可以使用小时表达式。例如;
GROUP BY cast(InteractionDate as date), (hour(InteractionDate)/4)
这会让你在第一桶中午夜到早上6点,下午6点到中午等等。
答案 1 :(得分:0)
您可以通过使用datediff获取间隔,然后进行整数除法,在任何时间段内聚合数据,如下所示:
group by datediff(hour, '1990-01-01T00:00:00', yourDatetime) / 3
数学是:从基准日期获得整数小时数,并将整数除以3,这将产生具有相同结果的连续3小时的组。然后它用于分组数据。
这将从您要指定的基准日期时间获得小时数。在这种情况下,唯一重要的部分是时间部分,它允许您决定3小时间隔的初始点。在这种情况下,间隔为[00:00 to 03:00]
,[03:00 to 06:00]
,依此类推。如果您需要不同的时间间隔,请设置不同的基准日期时间,例如'1990-01-01T00:01:00'
会为您提供时间间隔[01:00 to 04:00]
,[04:00 to 07:00]
,等等。
要获得更多详细信息,请参阅完整的答案:Group DateTime into 5,15,30 and 60 minute intervals
在这个答案中,您将看到除了聚合值之外,您还可以显示每个间隔的开始和结束日期时间。并对此解决方案有更深入的了解。