每隔n小时计算汇总数据

时间:2015-01-27 13:03:03

标签: sql sql-server tsql

我在一段时间内生成了一些数据。我使用下面的查询来计算每小时发生的“交互”次数。

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

我该怎么做?

2 个答案:

答案 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

在这个答案中,您将看到除了聚合值之外,您还可以显示每个间隔的开始和结束日期时间。并对此解决方案有更深入的了解。