选择最后3个连续行

时间:2014-10-27 16:14:53

标签: sql sql-server tsql

我一直盯着这个在存储过程中运行的查询变得更加困惑。

我有一张看起来像这样的桌子......

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

所以我有一个运行的作业,并在此表中记录每15分钟3个数据库的镜像状态。如果镜像状态不等于Synchronized,我需要一个查询,对于任何一个数据库名称进行3次连续检查。

因此,如果例如Database1在下午3点,然后在下午3点15分,那么在下午3点30分处于断开状态,这是我需要知道的。我现在正在做的是查看整个表格,如果在一个非同步状态的任何一个数据库的计数是3或更多,那么我正在服用一个不太我想要的acion。我只想在最后3次检查中这样做,就是这样。

这是我的查询。

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

任何帮助/建议都会很棒。 提前谢谢。

2 个答案:

答案 0 :(得分: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的原因。

答案 1 :(得分: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)