2016-09-26 1 views
0

Там в таблицу, которая выглядит следующим образом (есть несколько столбцов, но не имеет отношения к запросу):Проверьте, отображаются ли два разных значения последовательно в таблице в SQL?

DocumentId | DocumentStateId | TransitionMoment 
111222  -2    2016-04-21 
111222  -1    2016-04-22 
111222  -7    2016-04-23 
111222  -5    2016-04-24 
111222  -6    2016-04-25 
111222  -1    2016-04-26 
333141  -2    2016-05-01 
333141  -7    2016-05-09 
333141  -6    2016-05-10 
333141  -3    2016-05-15 
777525  -1    2016-02-10 
777525  -6    2016-02-10 
777525  -7    2016-02-10 
777525  -5    2016-02-10 
777525  -2    2016-02-10 

Какие у меня есть варианты, чтобы проверить, то ли пошел документ от государства «-7» в состояние «-6» последовательно (без перехода через другие состояния между ними)? В примере № документа. 33141.

Заранее благодарим!

+0

Может DocumentId иметь несколько -7 значений, или -6 значений? – jarlh

+0

Да, он может иметь несколько значений -7 или -6 –

ответ

0

В SQL Server 2012+ вы просто используете lag(). В SQL Server 2005 можно использовать apply:

select t.* 
from t cross apply 
    (select top 1 t2.* 
     from t t2 
     where t2.documentid = t.documentid and 
      t2.transitionmoment > t.transitionmoment 
     order by t2.transitionmoment desc 
    ) tnext 
where t.DocumentStateId = -7 and 
     tnext.DocumentStateId = -6; 
+0

Спасибо! С небольшими изменениями приложение работает отлично. –

0

Использование LEAD():

WITH CTE AS 
(
SELECT 
DocumentId, DocumentStateId, TransitionMoment, 
LEAD(DocumentStateId) OVER (ORDER BY TransitionMoment) NextSIDVal, 
LEAD(DocumentId) OVER (ORDER BY DocumentId) NextDIDVal 
FROM Table 
) 

SELECT DocumentId, DocumentStateId, TransitionMoment FROM CTE 
WHERE DocumentStateId = -7 AND NextSIDVal = -6 
AND DocumentId = NextDIDVal 

Использование row_number():

WITH CTE AS 
(
SELECT 
DocumentId, DocumentStateId, TransitionMoment, ROW_NUMBER() OVER (ORDER BY TransitionMoment) RowVal 
FROM Table 
) 

SELECT x.DocumentId, x.DocumentStateId, x.TransitionMoment 
FROM CTE x 
JOIN CTE y 
ON x.RowVal + 1 = y.RowVal 
WHERE x.DocumentStateId = -7 AND y.DocumentStateId = -6 
AND x.DocumentId = y.DocumentId