Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据sql server中每个组中的分钟数(日期),按每n分钟的日期时间范围对记录进行分组_Sql Server_Sql Server 2008_Date_Grouping_Intervals - Fatal编程技术网

Sql server 根据sql server中每个组中的分钟数(日期),按每n分钟的日期时间范围对记录进行分组

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:

我的表中有这些样本记录,我想每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: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,如上所述@霍根:谢谢你的提示。我试过了,但我不能在组上使用聚合函数。我如何使用它?请你写一个你的意思的例子好吗?