2014-10-27 78 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