4

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

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,0,datediff(day,0,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,0,datediff(day,0,DateCreated)), datepart(hour, DateCreated)
Order By dateadd(day,0,datediff(day,0,DateCreated)), datepart(hour, DateCreated)

我知道任何靠近的跑步都可能会被组合在一起,我对此很好。我只希望得到一个粗略的分组。

谢谢!

4

2 回答 2

3

再往前走几步:

SELECT
    Count(Id), 
    DATEPART(year, DateCreated) As yr, 
    DATEPART(month, DateCreated) As mth, 
    DATEPART(day, DateCreated) As day, 
    DATEPART(Hour, DateCreated) as hr, 
    DATEPART(minute, DateCreated) as mnt
FROM 
    MyReportTable
WHERE DateCreated between '5/4/2011' and '5/18/2011'
    and SourceType = 'File'
GROUP BY 
    DATEPART(year, DateCreated), 
    DATEPART(month, DateCreated), 
    DATEPART(day, DateCreated), 
    DATEPART(Hour, DateCreated),
    DATEPART(minute, DateCreated)
ORDER BY 
    DATEPART(year, DateCreated),
    DATEPART(month, DateCreated), 
    DATEPART(day, DateCreated), 
    DATEPART(Hour, DateCreated),
    DATEPART(minute, DateCreated)

编辑

要达到 15 分钟的分辨率,请将最后一列更改为

(DATEPART(minute, DateCreated)/15)

(在选择中添加 +1 以获得 1、2、3、4)。

于 2011-05-17T19:48:31.790 回答
3

如果您确定这些运行是连续的并且不重叠,您应该能够使用 Id 字段来分解您的组。查找仅相隔 1 的 Id 字段和大于某个阈值的 datecreated 字段。从您的数据来看,一次运行中的记录似乎最多在一分钟内输入,因此安全阈值可能是一分钟或更长时间。

这会给你你的开始时间

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。我将最后一个字段称为“排除”,因为它保存的 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 的其他查询将按上述方式工作。

于 2011-05-17T20:22:24.487 回答