基于sql server

时间:2015-11-18 04:19:27

标签: sql-server sql-server-2008 date grouping intervals

我在我的表中有这些样本记录,我想每3分钟对它们进行分组。基于每个组的min(Matched_BeginTime)。

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      

每条记录按match_Date分组,每3分钟一次 forexp,前5个记录应该在一个组中,因为它们在min(matchDate)+ 3minutes

的范围内
  

注意:我尝试使用之前给出的解决方案。喜欢这些:
  How to group time by hour or by 10 minutes

     

SQL SERVER - Group records by n minutes interval

     

这是我从上述解决方案中尝试的示例代码:

select datepart(minute, Matched_BeginTime)/3,min(Matched_BeginTime),Keywords
from [table]
group by datepart(minute, Matched_BeginTime)/3,Keywords
order by MIN(Matched_BeginTime)

,这就是结果:

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开始但不是基于Min(Matched_BeginTime)

感谢您的帮助

  

注意:通过使用存储过程,我可以做得很好,我更喜欢有一个   单个TSQL命令。

1 个答案:

答案 0 :(得分:0)

  

您可以使用子查询获取最小时间戳并使用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 
  

注意:   将此子查询添加到from行,不在哪里是相同的   作为“交叉连接”或没有on子句的常规连接 - 因为sub   只有一行和一列,它只是将每个行的单个值添加到其中。

如果您希望使用逗号“加入”多行,则可以使用我在此处显示的技术:https://stackoverflow.com/a/1785923/215752

但是,如果你有一个用于显示的前端,我希望创建逗号分隔列表更容易。