2011-05-17 69 views
3

我有一個應用程序可能每天運行多次。每次運行都會導致寫入表中的數據報告發生的事件。主報告表看起來是這樣的:按時間塊查詢記錄和分組

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) 

我明白,任何靠近在一起的跑步都可能會分組在一起,我對此很滿意。我只希望得到一個粗糙的分組。

謝謝!

回答

2

如果您確定這些運行是連續的並且不重疊,那麼您應該能夠使用Id字段來拆分您的組。查找相距僅1的Id字段,並且創建的字段大於某個閾值。從您的數據看來,運行中的記錄看起來好像是每隔一分鐘內輸入一次,因此安全閾值可能是一分鐘或更長時間。

這將讓你的開始時間

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; 

根據您的設置,您可能需要在一個查詢中執行所有這些操作,但您明白了。另外,第一次也是最後一次跑將不會被包括在內,因爲在第一次跑步中沒有起始身份證,並且在最後一次跑步中沒有終止身份證。爲了包含這些內容,您只需對這兩個範圍進行查詢,然後將它們與舊的DataRunGroups查詢結合在一起以創建新的DataRunGroups。使用DataRunGroups的其他查詢將如上所述正常工作。

+0

添加Sql或它是不可能的;)我明白你在說什麼,但我不知道如何在SQL中寫這個。我當然可以把邏輯放在消費代碼中,而不是期待sql提供它。 – NerdFury 2011-05-17 20:44:51

+0

Workin on it :) – 2011-05-17 21:08:03

+0

在發佈sql之前,我開始試圖解決它。我基本上和你得到的一樣,但發現通過加入id-1而不是+1我得到了啓動範圍,只有第一組退出。這是足夠老,我不在乎。謝謝你的幫助。 – NerdFury 2011-05-17 22:37:23

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)。

+0

這並沒有真正添加任何東西我有,但是會更列。如果可能的話,我希望能獲得比小時更好的分辨率。 – NerdFury 2011-05-17 20:15:41

+0

@NerdFury編輯了我的答案。添加了分鐘列以提高分辨率。你有沒有具體的決議? – 2011-05-17 20:21:25

+0

我看到你在那裏做了什麼。運行需要大約6分鐘,因此10到15分鐘就足夠了。這裏的問題是,它仍然基於絕對時間表(即9:00- 9:15,9:15-9:30),因此任何在一個時間範圍內開始並以另一個時間範圍結束的運行將顯示爲兩個運行。我最初的問題可能不夠清楚。如果pheedbaq可以爲他的解決方案提供sql(或者如果可以的話,我會接受你的答案),但我認爲它更符合我所尋找的內容。我鼓勵你堅持與我在一起。儘管如此,我可能會更好地使用代碼進行分組。謝謝! – NerdFury 2011-05-17 20:52:04