2014-10-27 79 views
0

我一直盯着在存儲過程中運行的這個查詢變得更加困惑。選擇最後3個連續行

我有一個表,看起來像這樣...

AsofDate  Database_Name  Mirroring_Sate 
DateTime  Database1   Synchronized 
DateTime  Database2   Suspended 
DateTime  Database3   Disconnected 
DateTime  Database1   Synchronized 
DateTime  Database2   Synchronized 
DateTime  Database3   Disconnected 
DateTime  Database1   Synchronized 
DateTime  Database2   Synchronized 
DateTime  Database3   Disconnected 

所以我有一個運行並記錄在此表中的鏡像狀態3個數據庫每15分鐘的工作。如果鏡像狀態不等於「已同步」,我需要一個查詢將針對任何一個數據庫名稱進行3次連續檢查。

因此,如果Database1在下午3點,然後3.15pm,然後在下午3點30分處於斷開狀態,這就是我需要知道的。我現在在做的是查看整個表格,如果在同步狀態以外的任何一個數據庫的計數是3或更多,那麼我正在採取一種不太符合我想要的行爲。我只想爲最後3次檢查做到這一點,就是這樣。

這是我的查詢,因爲它代表。

IF EXISTS (SELECT 1 
      FROM dbo.U_MirroringStatus WITH (NOLOCK) 
      where mirroring_state_desc <> 'SYNCHRONIZED' 
      GROUP BY database_name 
      HAVING COUNT(*) >= @MirroringStatusViolationCountForAlert 
      ) 

任何幫助/建議將是偉大的。 在此先感謝。

回答

1

也許這樣的事情會做你需要的東西:

IF EXISTS (SELECT 1 
      FROM (SELECT TOP 3 ms.* 
       FROM dbo.U_MirroringStatus WITH (NOLOCK) 
       WHERE database_name = @DatabaseName 
       ORDER BY AsOfDate DESC 
       ) ms 
      WHERE mirroring_state_desc <> 'SYNCHRONIZED' 
      HAVING COUNT(*) >= @MirroringStatusViolationCountForAlert 
      ) 

在本文中,您指定要這一個單一的數據庫,這就是爲什麼我添加了where

+0

三江源。我基本上想通過數據庫名稱對檢查進行分組。查詢需要檢查所有數據庫,而不是特定的數據庫。因此,如果Database1斷開連接,最後3次檢查會執行一些操作。 – user2841861 2014-10-27 16:21:13

+0

我更新了表格,以便看到它的樣子。所以查詢應該返回數據庫3,因爲最後3次檢查已經斷開這個數據庫。 – user2841861 2014-10-27 16:31:52

1
select Database_Name 
    from (select AsofDate, Database_Name, Mirroring_Sate 
       ROW_NUMBER () Over (partition by Database_Name order by AsofDate desc) as row 
     ) as xx 
where Mirroring_Sate <> 'SYNCHRONIZED' 
    and row <= 3 
group by Database_Name 
having count(*) = 3 

ROW_NUMBER (Transact-SQL)

+0

我收到以下錯誤與此查詢。 Msg 102,Level 15,State 1,Line 3 '('。 – user2841861 2014-10-28 08:31:13

+0

需要爲ROW_NUMBER() – Paparazzi 2014-10-28 12:49:04