我有以下数据表:
[Date];[Time];[ProcessID];[ID]
24.09.2012;08:18:00;4000;1
24.09.2012;08:18:00;4000;2
24.09.2012;08:19:00;4001;3
24.09.2012;08:23:00;4002;4
24.09.2012;08:32:00;4003;5
...
结果,我希望按15分钟的时间间隔进行分组以计算ProcessID的数量:
[Interval];[ProcessID Count]
8:15:00 - 8:29:00;3
8:30:00 - 8:45:00;1
如何实现这个目标?
最佳答案
这是针对Linq-to-SQL(在SQL Server上)的解决方案,其中DateTime在单个字段中(LINQpad查询):
Const BaseDate As Date = #9/24/2012#
Const PeriodMinutes As Integer = 15
Dim p = From t In TestData _
Group By q=CInt(Math.Floor((t.SomeDate - BaseDate).TotalMinutes/PeriodMinutes)) Into Group _
Select s=BaseDate.AddMinutes(q*PeriodMinutes), _
e=BaseDate.AddMinutes((q+1)*PeriodMinutes), _
ids=Aggregate g In Group Select g.ProcessID Distinct Into Count()
p.Dump
使用不同的类型和其他“小”调整可以产生更简单的SQL后端代码。
对于实际的数据库,尽管现在取决于通过Linq-to-SQL和/或数据库的驱动程序将“时间”列转换为什么,但仍需要调整
Group By
。由于它是一个
TimeSpan
,所以Group By
变为: Group By d=t.[Date], q=CInt(Math.Floor(t.[Time].TotalMinutes/PeriodMinutes)) Into Group _
Select s=d.AddMinutes(q*PeriodMinutes), _
e=d.AddMinutes((q+1)*PeriodMinutes), _
ids=Aggregate g In Group Select g.ProcessID Distinct Into Count()