Sql 按5秒的间隔分组[时间]

Sql 按5秒的间隔分组[时间],sql,sql-server,tsql,Sql,Sql Server,Tsql,我有包含秒[时间]值的数据。我想根据每秒记录的数量来计算数据 其工作原理如下: SELECT [Time], count(*) FROM [dbo].[Times] GROUP BY [Time] ORDER By [Time] 这给了我: +----------+----+ | 00:00:00 | 4 | +----------+----+ | 00:00:01 | 2 | +----------+----+ | 00:00:02 | 1 | +----------+----+

我有包含秒[时间]值的数据。我想根据每秒记录的数量来计算数据

其工作原理如下:

SELECT [Time], count(*) 

FROM [dbo].[Times]
GROUP BY
[Time] ORDER By [Time]
这给了我:

+----------+----+
| 00:00:00 | 4  |
+----------+----+
| 00:00:01 | 2  |
+----------+----+
| 00:00:02 | 1  |
+----------+----+
| 00:00:08 | 2  |
+----------+----+
...
我想分组并以5秒的间隔对它们进行计数,因此结果如下所示:

+----------+----+
| 00:00:05 | 7  |   <--   # of records between 0:00:00 and 0:00:05
+----------+----+
| 00:00:10 | 2  |   <--   # of records between 0:00:05 and 0:00:10
+----------+----+
...
在MS SQL中有什么好方法可以做到这一点吗?

这里有一种方法:

select cast(dateadd(second, (datediff(second, 0, [time]) / 5) * 5, 0) as time(0)) as [time],
       count(*)
from [dbo].[Times] t
group by dateadd(second, (datediff(second, 0, [time]) / 5) * 5, 0)
order by min([time]);
编辑:

正如评论中指出的,您可以写:

select v.[Time], count(*)
from [dbo].[Times] t cross apply
     (values (cast(dateadd(second, (datediff(second, 0, [time]) / 5) * 5, 0) as time(0)) )
     ) as v([Time])
group by v.[Time]
order by v.[Time];
这将复杂的计算放在了一个地方——避免了我在编辑原始答案时所犯的错误类型。

这里有一种方法:

select cast(dateadd(second, (datediff(second, 0, [time]) / 5) * 5, 0) as time(0)) as [time],
       count(*)
from [dbo].[Times] t
group by dateadd(second, (datediff(second, 0, [time]) / 5) * 5, 0)
order by min([time]);
编辑:

正如评论中指出的,您可以写:

select v.[Time], count(*)
from [dbo].[Times] t cross apply
     (values (cast(dateadd(second, (datediff(second, 0, [time]) / 5) * 5, 0) as time(0)) )
     ) as v([Time])
group by v.[Time]
order by v.[Time];

这就把复杂的计算放在了一个地方——避免了我在编辑原始答案时所犯的错误。

如果您尝试使用BigObject数据库,它提供了轻松完成这一操作的功能。类似以下的查询将返回所需的结果:

mysql> select time_seg(datetime,5s) as ti, COUNT(*) from t group by ts order by ti;
+---------------------+----------+
| ti                  | COUNT(*) |
+---------------------+----------+
| 2018-05-09 00:00:00 |        3 |
| 2018-05-09 00:00:05 |        1 |
+---------------------+----------+

如果您尝试使用BigObject数据库,它提供了轻松完成此任务的功能。类似以下的查询将返回所需的结果:

mysql> select time_seg(datetime,5s) as ti, COUNT(*) from t group by ts order by ti;
+---------------------+----------+
| ti                  | COUNT(*) |
+---------------------+----------+
| 2018-05-09 00:00:00 |        3 |
| 2018-05-09 00:00:05 |        1 |
+---------------------+----------+

分组部分看起来效果不错,但显示部分并不是我所期望的1900-01-01 00:00:00.000:7',1900-01-06 00:00:00.000:2'您能建议第一列的格式如下:00:00:05,00:00:10?您在DATEADD函数中错误放置了参数。根据DATEDIFF生成结果日期。DATEADD函数应为dateaddsecond、datediffsecond、0、[time]/5+1*5,0。我添加了/5+1以00:00开始计算结果:05@Prdp . . . 谢谢。@DDan。你可以在某个时间强制转换。分组部分看起来工作得很好,但显示部分不是我所期望的1900-01-01 00:00:00.000:7',1900-01-06 00:00:00.000:2'您能建议第一列的格式如下:00:00:05,00:00:10?您在DATEADD函数中错误放置了参数。根据DATEDIFF生成结果日期。DATEADD函数应为dateaddsecond、datediffsecond、0、[time]/5+1*5,0。我添加了/5+1以00:00开始计算结果:05@Prdp . . . 谢谢。@DDan。您可以强制转换为时间。查看内联函数以舍入时间。请参见:选择CastDateaddSECOND、DatediffSECOND、0、[time]/5+1*5、0作为[secs]的时间,按DateaddSECOND、DatediffSECOND、0、[time]/5+1*5、0从[dbo].[Times]组中计数*;查看内联函数以舍入时间。请参见:选择CastDateaddSECOND、DatediffSECOND、0、[time]/5+1*5、0作为[secs]的时间,按DateaddSECOND、DatediffSECOND、0、[time]/5+1*5、0从[dbo].[Times]组中计数*;