sql – 按时间块查询记录和分组
我有一个可能每天运行几次的应用程序.每次运行都会生成写入表的数据,以报告发生的事件.主报表如下所示: Id SourceId SourceType DateCreated 5048 433 FILE 5/17/2011 9:14:12 AM 5049 346 FILE 5/17/2011 9:14:22 AM 5050 444 FILE 5/17/2011 9:14:51 AM 5051 279 FILE 5/17/2011 9:15:02 AM 5052 433 FILE 5/17/2011 12:34:12 AM 5053 346 FILE 5/17/2011 12:34:22 AM 5054 444 FILE 5/17/2011 12:34:51 AM 5055 279 FILE 5/17/2011 12:35:02 AM 我可以说有两次运行,但我想要一种方法来查询日期范围,即运行进程的次数.我想有一个查询,导致进程开始的时间和组中的文件数.这个查询有点让我得到我想要的东西,我可以看到什么日期和时间以及运行了多少文件,但不完全是我想要的.例如,它不能容纳从8:58到9:04的运行.例如,它还将以9:02和9:15开始的分组运行. Select dateadd(day,datediff(day,DateCreated)) as [Date],datepart(hour,DateCreated) as [Hour],Count(*) [File Count] From MyReportTable Where DateCreated between '5/4/2011' and '5/18/2011' and SourceType = 'File' Group By dateadd(day,DateCreated)),DateCreated) Order By dateadd(day,DateCreated) 我明白,任何靠近的跑步都可能会聚集在一起,我很好.我只希望得到一个粗略的分组. 谢谢! 解决方法如果您确定这些运行是连续的并且不重叠,那么您应该能够使用Id字段来分解您的组.查找仅相隔1的Id字段和相隔大于某个阈值的datedated字段.从您的数据看,运行中的记录最多只能在一分钟内输入,因此安全阈值可能是一分钟或更长.这将为您提供开始时间 SELECT mrtB.Id,mrtB.DateCreated FROM MyReportTable AS mrtA INNER JOIN MyReportTable AS mrtB ON (mrtA.Id + 1) = mrtB.Id WHERE DateDiff(mi,mrtA.DateCreated,mrtB.DateCreated) >= 1 我称之为DataRunStarts 现在,您可以使用它来获取有关组开始和结束位置的信息 SELECT drsA.Id AS StartID,drsA.DateCreated,Min(drsB.Id) AS ExcludedEndId FROM DataRunStarts AS drsA,DataRunStarts AS drsB WHERE (((drsB.Id)>[drsA].[id])) GROUP BY drsA.Id,drsA.DateCreated 我称之为DataRunGroups.我调用了最后一个字段“Excluded”,因为它所持有的id只是用于定义将被拉出的id组的结束边界. 现在我们可以使用DataRunGroups和MyReportTable来获取计数 SELECT DataRunGroups.StartID,Count(MyReportTable.Id) AS CountOfRecords FROM DataRunGroups,MyReportTable WHERE (((MyReportTable.Id)>=[StartId] And (MyReportTable.Id)<[ExcludedEndId])) GROUP BY DataRunGroups.StartID; 我会称之为DataRunCounts 现在我们可以将DataRunGroups和DataRunCounts放在一起以获得开始时间和计数. SELECT DataRunGroups.DateCreated,DataRunCounts.CountOfRecords FROM DataRunGroups INNER JOIN DataRunCounts ON DataRunGroups.StartID = DataRunCounts.StartID; 根据您的设置,您可能需要在一个查询中执行所有这些操作,但您明白了.此外,第一次和最后一次运行都不会包含在此中,因为第一次运行时没有启动ID,并且最后一次运行没有结束ID.要包含这些内容,您只需对这两个范围进行查询,并将它们与旧的DataRunGroups查询结合在一起以创建新的DataRunGroups.使用DataRunGroups的其他查询将如上所述工作. (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |