2016-02-25 51 views
0

我之前詢問過這個查詢,並且我取得了一些進展。現在我需要一個更受限制的數據集,但是我的代碼存在問題。下面是我使用的是什麼:SQL 2012返回次數和兩次之間的總和

DECLARE @mindate DATETIME = '2011-12-30' 
DECLARE @maxdate DATETIME = '2011-12-31' 

;WITH cte 
AS (SELECT 
     CONVERT(DATETIME,@mindate) AS [StartDate], 
     DATEADD(MI, 10,CONVERT(DATETIME,@mindate)) AS [EndDate] 
    UNION ALL 
    SELECT 
     DATEADD(MI, 10, [StartDate]), 
     DATEADD(MI, 10, [EndDate]) 
    FROM cte 
    WHERE [StartDate] < CONVERT(DATETIME,@maxdate)) 

SELECT 
    [StartDate], 
    [EndDate], 
    COUNT(cr.MESSAGE_SIZE) AS [TransactionItemsMigrated], 
    SUM(cr.MESSAGE_SIZE) AS [TransactionSizeBytes], 
    (SELECT COUNT(*) FROM MESSAGE WHERE MESSAGE_STATUS = 2) [CurrentItemsFailed] 
FROM cte 
LEFT JOIN CROSS_REFERENCE cr 
    ON cr.MIGRATION_DATE_TIME BETWEEN [StartDate] AND [EndDate] 
GROUP BY cte.StartDate, cte.EndDate 
OPTION (MAXRECURSION 0) 

我需要顯示一排,每10分鐘,即使TransactionItemsMigrated和/或TransactionSizeBytes爲0或NULL。我得到的結果不會每10分鐘顯示一次。 StartDate和EndDate之間的時間跨度顯示正確,並且似乎正確計數了項目和大小,但StartDate正在跳躍超過10分鐘。下面的每個條目都是一行。

StartDate 2016-02-01 00:40:00.000 
EndDate 2016-02-01 00:50:00.000 
TransactionItemsMigrated 1925 
TransactionSizeBytes 1843712 
CurrentItemsFailed 6538601 

StartDate 2016-02-01 01:50:00.000 
EndDate 2016-02-01 02:00:00.000 
TransactionItemsMigrated 1892 
TransactionSizeBytes 51712 
CurrentItemsFailed 6538601 

我無法粘貼結果,因爲它在沒有複製/粘貼訪問權限的虛擬機上運行。有什麼建議麼?

+0

此外,示例數據只是取樣,而不是我的實際結果。不要擔心日期,除非看到StartTime的 –

+2

之間存在差距您可以通過添加訂單並檢查它是否真的沒有顯示所有間隔或只是無序嗎? – mxix

+1

您是否有意在'@ maxdate'上排除10分鐘的間隔?請注意,當您可能需要'start <= event HABO

回答

0

我可以建議你忘記使用遞歸來實現你的目標,因爲這不會執行,你已經看起來有問題嗎?我想用tally table去做。

這是您的腳本使用理貨表的翻譯。這將表現得更好,同時,它可能會或可能不會解決你的問題,但如果它仍然存在,你一定會對這個問題有更多的瞭解。

;WITH 
t1  AS (SELECT N = 1 UNION ALL SELECT 1 N), 
t2  AS (SELECT N = 1 FROM t1 x, t1 y), 
t3  AS (SELECT N = 1 FROM t2 x, t2 y), 
t4  AS (SELECT N = 1 FROM t3 x, t3 y), 
t5  AS (SELECT N = 1 FROM t4 x, t4 y), 
Tally AS (SELECT N = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
      FROM t5 AS x, t5 as y)--building a tally with recursive but an less expensive one then the one you had. 

SET DATEFORMAT YMD 
DECLARE @mindate DATETIME = '2011-12-30' 
DECLARE @maxdate DATETIME = '2011-12-31' 
DECLARE @NMax INT 
SELECT @NMax = ISNULL(DATEDIFF(MINUTE, @mindate, @maxdate)/10, 0) --Count the number of 10 minutes slice between the two dates. 

SELECT [StartDate]     = DATEADD(MINUTE, (Tally.N - 1) * 10, @mindate), 
     [EndDate]     = DATEADD(MINUTE, (Tally.N) * 10, @mindate), 
     [TransactionItemsMigrated] = COUNT(cr.MESSAGE_SIZE), 
     [TransactionSizeBytes]  = SUM(cr.MESSAGE_SIZE), 
     [CurrentItemsFailed]  = (SELECT COUNT(*) FROM MESSAGE WHERE MESSAGE_STATUS = 2) 
FROM Tally 
LEFT JOIN CROSS_REFERENCE AS cr ON DATEADD(MINUTE, (Tally.N - 1) * 10, @mindate) >= cr.MIGRATION_DATE_TIME 
           AND DATEADD(MINUTE, (Tally.N) * 10, @mindate) < cr.MIGRATION_DATE_TIME 
WHERE Tally.N <= @NMax 
ORDER BY Tally.N 
+0

像@habo評論說的,我用Start <= eventDate AXMIM

+0

取代了BETWEEN這是個很好的信息,我非常感謝這個貢獻。另外,我真的很喜歡你的代碼格式!非常好的眼睛。然而,這一次花費了大約24.5秒的時間,另一個(現在我已經開始工作了!不知道是什麼原因導致了這種差異,但我現在會和其他人一起去。再次感謝! –

+0

@doc,我不好,我只是重新讀你的代碼,看到你的cte碰巧就像一個TallyTable。此外,您的理貨表建立了正確的日期,所以它可以在連接中使用。我必須計算它,所以是... – AXMIM