2014-10-27 2 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 минут. Мне нужен запрос, который будет для любого имени базы данных для трех последовательных проверок, если статус зеркалирования не равен Synchronized.

Так что если, например, Database1 в 3 часа дня, то в 3,15 часа, то в 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

+0

Я обновил таблицу, чтобы вы могли видеть, как она выглядит. Таким образом, запрос должен возвращать базу данных 3, поскольку последние три проверки были отключены для этого db. – user2841861

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, уровень 15, состояние 1, строка 3 Неправильный синтаксис около '('. – user2841861

+0

должен быть ROW_NUMBER() – Paparazzi

Смежные вопросы