Sql server 根据sql server中每个组中的分钟数(日期),按每n分钟的日期时间范围对记录进行分组
我的表中有这些样本记录,我想每3分钟对它们进行一次分组。基于每组的min(匹配的开始时间)Sql server 根据sql server中每个组中的分钟数(日期),按每n分钟的日期时间范围对记录进行分组,sql-server,sql-server-2008,date,grouping,intervals,Sql Server,Sql Server 2008,Date,Grouping,Intervals,我的表中有这些样本记录,我想每3分钟对它们进行一次分组。基于每组的min(匹配的开始时间) Keywords Matched_BeginTime Station_ID Program_ID TVCapCID ScheduleID "Police" 2015-11-17 17:00:37.160 120 715 486290066 102691 "Police" 2015-11-17 17:
Keywords Matched_BeginTime Station_ID Program_ID TVCapCID ScheduleID
"Police" 2015-11-17 17:00:37.160 120 715 486290066 102691
"Police" 2015-11-17 17:01:48.620 120 715 486290088 102691
"Police" 2015-11-17 17:02:02.140 120 715 486290091 102691
"Police" 2015-11-17 17:02:53.100 120 715 486290102 102691
"Police" 2015-11-17 17:03:03.540 120 715 486290106 102691
"Police" 2015-11-17 17:03:48.020 120 715 486290119 102691
"SAS" 2015-11-17 17:03:57.940 120 715 486290122 102691
"SAS" 2015-11-17 17:08:25.800 120 715 486290197 102691
"Police" 2015-11-17 17:08:32.960 120 715 486290199 102691
"Emergency" 2015-11-17 17:09:02.540 120 715 486290206 102691
"SAS" 2015-11-17 17:10:55.640 120 715 486290246 102691
"Police" 2015-11-17 17:12:23.240 120 715 486290273 102691
这是我理想的结果:
Keywords_Groups Min_Matched_BeginTime
Police 11/17/2015 17:00:37
Police,SES 11/17/2015 17:03:48
SES,Police,Emergency 11/17/2015 17:08:26
Police 11/17/2015 17:12:23
每个记录每3分钟按匹配的日期分组。对于XP,前5条记录应在一个组中,因为它们在
min(匹配日期)+3分钟的范围内
注意:我尝试使用之前给出的解决方案。像这些:
这是我从上述解决方案中尝试的示例代码:
这就是结果:
0 2015-11-17 17:00:37.160 "Police"
1 2015-11-17 17:03:03.540 "Police"
1 2015-11-17 17:03:57.940 "SAS"
2 2015-11-17 17:08:25.800 "SAS"
2 2015-11-17 17:08:32.960 "Police"
3 2015-11-17 17:09:02.540 "Emergency"
3 2015-11-17 17:10:55.640 "SAS"
4 2015-11-17 17:12:23.240 "Police"
如您所见,它按分钟除以3分组,从00开始,但不基于分钟(匹配的开始时间)
谢谢你的帮助
注意:通过使用存储过程,我可以做得很好,我更喜欢使用
只需一个TSQL命令
您可以使用子查询来获取最小时间戳,并使用datediff来
找到分钟数并除以3,如上所述。
msdn.microsoft.com/en-us/library/ms189794.aspx
获取最小时间戳的子查询
Select min(Matched_BeginTime) as minMBT FROM [table]
将其添加到查询中并使用datediff:
select datediff(minute, sub.minMBT, Matched_BeginTime)/3,Keywords
from [table], (Select min(Matched_BeginTime) as minMBT FROM [table]) as Sub
group by datediff(minute, sub.minMBT, Matched_BeginTime)/3,Keywords
order by datediff(minute, sub.minMBT, Matched_BeginTime)/3
注意:
将此子查询添加到“发件人”行时,没有“where”是相同的
作为“交叉联接”或不带on子句的常规联接——因为子
只有一行和一列,它只是将单个值添加到每行
如果您想用逗号“连接”多行,可以使用我在这里介绍的技术:
但是,如果您有一个用于显示的前端,我希望创建逗号分隔的列表会更容易
您可以使用子查询来获取最小时间戳,并使用datediff来
找到分钟数并除以3,如上所述。
msdn.microsoft.com/en-us/library/ms189794.aspx
获取最小时间戳的子查询
Select min(Matched_BeginTime) as minMBT FROM [table]
将其添加到查询中并使用datediff:
select datediff(minute, sub.minMBT, Matched_BeginTime)/3,Keywords
from [table], (Select min(Matched_BeginTime) as minMBT FROM [table]) as Sub
group by datediff(minute, sub.minMBT, Matched_BeginTime)/3,Keywords
order by datediff(minute, sub.minMBT, Matched_BeginTime)/3
注意:
将此子查询添加到“发件人”行时,没有“where”是相同的
作为“交叉联接”或不带on子句的常规联接——因为子
只有一行和一列,它只是将单个值添加到每行
如果您想用逗号“连接”多行,可以使用我在这里介绍的技术:
但是,如果您有一个用于显示的前端,我希望创建逗号分隔的列表会更容易。您想如何“汇总”您的电台ID和节目ID?例如,有没有可能在3分钟内出现不同ID的情况?如果是这样,这些应该如何显示?@Thessaman不,实际上它们可以被忽略。我已经从结果中删除了它们。您可以使用子查询来获取min时间戳,并使用datediff来查找分钟数并除以3,如上所述@霍根:谢谢你的提示。我试过了,但我不能在组上使用聚合函数。我如何使用它?你能写一个例子说明你的意思吗?你想如何“汇总”你的电台ID和节目ID?例如,有没有可能在3分钟内出现不同ID的情况?如果是这样,这些应该如何显示?@Thessaman不,实际上它们可以被忽略。我已经从结果中删除了它们。您可以使用子查询来获取min时间戳,并使用datediff来查找分钟数并除以3,如上所述@霍根:谢谢你的提示。我试过了,但我不能在组上使用聚合函数。我如何使用它?请你写一个你的意思的例子好吗?