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

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

发布时间:2021-01-17 07:48:25 所属栏目:编程 来源:网络整理
导读:我有一个也许天天运行屡次的应用措施.每次运行城市天生写入表的数据,以陈诉产生的变乱.主报表如下所示: 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 AM5051 2

我有一个也许天天运行屡次的应用措施.每次运行城市天生写入表的数据,以陈诉产生的变乱.主报表如下所示:

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

(编辑:湖南网)

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

    热点阅读