我有一个带有列的表,该列visit_date
是一个datetime
对象,其格式YYYY-MM-DD HH:MI:SS
如下所示:
visit_date |visit_id
-------------------|-----
2010-11-01 00:02:00|92314
2010-11-01 23:05:21|23498
2010-11-01 12:42:31|12343
2010-11-02 05:13:21|79881
2010-11-02 14:35:15|22134
2010-11-02 16:12:23|12348
2010-11-03 01:22:44|12384
2010-11-03 05:23:41|12394
2010-11-03 15:13:55|99384
我想按日期和该日期的8小时窗口分组,以便:
interval |count
-------------------|-----
2010-11-01 00:00:00|1
2010-11-01 08:00:00|2
2010-11-01 16:00:00|3
2010-11-02 00:00:00|4
2010-11-02 08:00:00|5
2010-11-02 16:00:00|6
2010-11-03 00:00:00|7
2010-11-03 08:00:00|8
2010-11-03 16:00:00|9
我的原始查询(仅使用日期)为:
SELECT CAST(visit_date as DATE), count(1) as count
FROM table
GROUP BY CAST(visit_date as DATE)
ORDER BY CAST(visit_date as DATE)
但这仅按日期分组。
是否有建议的方法来获取每天每个间隔的间隔计数?我已经看到了使用的实现DATEADD
,DATEPART
但不确定在这种情况下哪种方法最有意义。
谢谢!
将小时数添加到您的分组和计数中:
SELECT
CAST(visit_date as DATE),
HOUR(visit_date)/8 as ival8h
count(1) as count
FROM table
GROUP BY CAST(visit_date as DATE), HOUR(visit_date)/8
ORDER BY CAST(visit_date as DATE)
hour函数返回经过日期的小时数,将其除以8得到间隔的整数,因此0到7变为0,8到16变为1,依此类推。
如果您希望将其作为固定在8h左右的时间返回,请再次将其乘以8,并将其格式化为NN:00:00,或将其添加到日期,因此:
SELECT
DATEADD(hour, (HOUR(visit_date)/8)*8, CAST(CAST(visit_date as DATE) as DATETIME) as quantized_date,
count(1) as count
FROM table
GROUP BY DATEADD(hour, (HOUR(visit_date)/8)*8, CAST(CAST(visit_date as DATE) as DATETIME)
ORDER BY CAST(visit_date as DATE)
这基本上将小时数向下舍入较小的8h市场,并将其添加到午夜。日期上需要两次强制转换(可能),因为DATEADD不会将日期加上小时,而只将日期时间添加至日期,但是我们需要强制转换日期才能将tine元素固定为午夜
如果您希望在没有事件发生的期间有一个日期和一个0计数,请使用数字表或行生成器并创建一个日期序列以将您的真实数据左连接到该数据上,然后计算由假数据分组的真实数据日期
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句