2015-12-16 18 views
0

大家好我需要顯示一些報告,但我沒有解決這個結果。 請幫我指導解決方案以查詢此結果。SQL查詢彙總報告groupby狀態和計算差異時間

這是我的表(登錄)

This is my table (log)

我需要編寫SQL查詢生成以下結果: I need to write SQL query to generate the following results

請指引我, 謝謝大家的答案。

+0

你能設置一個SQL小提琴? –

+0

我不明白你的結果背後是「失敗」還是「最後確定」!! - 請在您的標籤中選擇MySQL或SQL Server之一。 –

+0

你正在分組什麼?我看到4個相同的行。 –

回答

0

這是一個島嶼和差距問題可以通過使用ROW_NUMBER解決:

SQL Fiddle

;WITH Cte AS(
    SELECT *, 
     grp = ROW_NUMBER() OVER(PARTITION BY NODE, STATUS ORDER BY DATE_TIME) 
       - ROW_NUMBER() OVER(PARTITION BY NODE, STATUS, VALUE ORDER BY DATE_TIME) 
    FROM [Log] 
), 
CteMinMax AS(
    SELECT 
     NODE, 
     STATUS, 
     VALUE, 
     MIN_DATE_TIME = MIN(DATE_TIME), 
     MAX_DATE_TIME = MAX(DATE_TIME) 
    FROM Cte 
    GROUP BY 
     NODE, STATUS, VALUE, grp 
) 
SELECT 
    NODE, 
    STATUS, 
    VALUE, 
    [Begin Failed] = cmm.MIN_DATE_TIME, 
    [Last OK]  = x.MIN_DATE_TIME, 
    [Time/Minute] = DATEDIFF(MINUTE, cmm.MIN_DATE_TIME, x.MIN_DATE_TIME) 
FROM CteMinMax cmm 
CROSS APPLY(
    SELECT TOP 1 MIN_DATE_TIME 
    FROM CteMinMax 
    WHERE 
     NODE = cmm.NODE 
     AND STATUS = cmm.STATUS 
     AND VALUE = 0 
     AND MIN_DATE_TIME > cmm.MIN_DATE_TIME 
) x 
WHERE cmm.VALUE = 1 

結果

| NODE |   STATUS | VALUE |    Begin Failed |     Last OK | Time/Minute | 
|------|----------------|-------|----------------------------|----------------------------|-------------| 
| A | SQL Connection |  1 | December, 02 2015 14:02:00 | December, 02 2015 14:04:00 |   2 | 
| A | SQL Connection |  1 | December, 02 2015 14:05:00 | December, 02 2015 14:08:00 |   3 | 
| A | SQL Connection |  1 | December, 02 2015 14:12:00 | December, 02 2015 14:15:00 |   3 | 
| A | SQL Connection |  1 | December, 02 2015 14:17:00 | December, 02 2015 14:18:00 |   1 | 
+0

Felix Pamittan感謝您的支持, 我會盡快爲您查詢並更新結果。 – bobekook

+0

嗨費利克斯Pamittan,它工作正常。 非常感謝。 – bobekook

+0

沒問題。很高興得到了幫助。 –