2014-01-10 74 views
0
水平分組

,你在你的SQL Server有一個表(編輯:prensently SQL Server 2008中)看起來像這樣的數據庫:按日期或時間順序查看分組記錄。可能是日誌表

Date     Id State 
================================= 
2013-09-12 15:02:41,844 1 OK 
2013-09-12 15:02:41,844 2 OK 
2013-09-12 15:02:41,844 3 ERROR 
2013-09-12 15:02:41,844 4 ERROR 
2013-09-12 15:02:41,844 5 ERROR 
2013-09-13 15:02:41,844 1 ERROR 
2013-09-14 15:02:41,844 1 OK 
2013-09-15 15:02:41,844 1 ERROR 
2013-09-15 15:02:41,844 2 ERROR 

表的purpouse是保存記錄的狀態。我寫了這個表,但現在我無法弄清楚如何查詢它在一個時間序列中的不同狀態的概述。

我期待的結果是這樣的:

2013-09-12 16:00:00 OK 2 
2013-09-12 16:00:00 ERROR 3 
2013-09-13 16:00:00 OK 1 
2013-09-13 16:00:00 ERROR 4 
2013-09-14 16:00:00 OK 2 
2013-09-14 16:00:00 ERROR 3 
2013-09-15 16:00:00 OK 0 
2013-09-15 16:00:00 ERROR 5 

編輯:我想實現我的目標狀態的一天按一天視圖。哪些對象有錯誤,哪些是可以的。也許車庫會是一個更好的例子,但我會堅持這一點。

  • 12日有3個物體有ERROR,2個有OK。
  • 13日,一個對象從OK變爲Error。我現在有4個對象處於ERROR狀態,而且一個是OK的。
  • 14日我的ID爲1的對象是固定的,我現在有

我想通了一個錯誤狀態恢復到兩個對象都OK>三(發現)如何生成一個序列日期(不使用變量聲明)是這樣的:

;WITH dates 
AS (
    SELECT CAST('2013-12-17 16:00:00' AS DATETIME) 'date' 

    UNION ALL 

    SELECT DATEADD(dd, 1, t.DATE) 
    FROM dates t 
    WHERE DATEADD(dd, 1, t.DATE) <= GETDATE() 
    ) 
SELECT dates.DATE 
FROM dates 

,我有一個查詢,做相關分組(我認爲),提供所需的輸出(和點):

Date State Count(state) 
=======================  
2013-09-12 16:00:00 OK 2 
     2013-09-12 16:00:00 ERROR 3 
     2013-09-13 16:00:00 ERROR 1 
     2013-09-14 16:00:00 OK 1 
     2013-09-15 16:00:00 ERROR 1 

所以問題是,你如何將日期序列與我的分組結果結合起來以達到預期的結果。

+0

我喜歡cte。問題是,它只會返回儘可能多的日期(+/- 1),因爲您的遞歸級別已啓用... –

+0

我不太瞭解您的要求。你想要計算什麼?我的第一個猜測是「報告日期時間之前的24小時的每個州的數值。」但我無法弄清楚如何爲「錯誤」和「2013-09-13」獲得Count = 4。 – Bill

+0

輸出中的列是什麼?例如,我真的看不到'2013-09-13 16:00:00確定1'來自 –

回答

1

在SQL Server 2012提供了窗口功能,您可以使用下面的查詢:

SELECT date, 
     sum(ok_mod) over (order by date) as ok 
FROM (
    SELECT date, 
     sum(case when state = 'OK' then 1 
        when state = 'ERROR' and prev_state is not null then -1 
        else 0 
      end) as ok_mod 
    FROM (
    SELECT date, id, state, 
      lag(state) over (partition by id order by date) prev_state 
    FROM data 
) AS data 
    GROUP BY date 
) AS data 
ORDER BY date; 

這使您只有OK一部分,但你可以爲錯誤的部分也容易工會相應的查詢。 SQL小提琴here

隨着2008版imho你不會沒有一個程序或非常複雜的查詢。

+0

謝謝你的幫助。太糟糕了,我目前停留在2008年的環境。我的錯。一旦我們轉移到2012年,我會盡快對此進行測試,屆時任何一週都會如此。 – Fontanka16