加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 按时间块查询记录和分组

发布时间:2021-01-17 12:17:20 所属栏目:MsSql教程 来源:网络整理
导读:我有一个可能每天运行几次的应用程序.每次运行都会生成写入表的数据,以报告发生的事件.主报表如下所示: Id SourceId SourceType DateCreated5048 433 FILE 5/17/2011 9:14:12 AM5049 346 FILE 5/17/2011 9:14:22 AM5050 444 FILE 5/17/2011 9:14:51 AM505

我有一个可能每天运行几次的应用程序.每次运行都会生成写入表的数据,以报告发生的事件.主报表如下所示:

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的其他查询将如上所述工作.

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读