2015-12-28 3 views
6

Я пытаюсь найти оптимизированный способ определить, существует ли в списке определенный набор значений.Поиск появления списка значений

Например, предположим следующий список записей в таблице

Id   Value 
1   A 
2   B 
3   A 
4   C 
5   A 
6   B 
7   C 
8   C 
9   A 

Я пытаюсь найти способ, чтобы проверить, сколько раз последовательность {A, B} или {A, B, C}, например.

Я знаю, что могу делать это с помощью курсоров, но я проверял, есть ли другой вариант, который был бы предпочтительнее с точки зрения производительности.

В результате я ожидал бы что-то вроде этого:

{A, B}: 2 times: 
{A, B, C}: 1 time. 

Я использую Sql Server.

+0

ли вы имеете в виду без пробелов? –

+0

В этом случае я использую SQl Server. –

+0

Совет. Полезно пометить вопросы базы данных как с помощью соответствующего программного обеспечения (MySQL, Oracle, DB2, ...) и версии, например. 'SQL-сервер-2014'. Различия в синтаксисе и особенностях часто влияют на ответы. – HABO

ответ

5

Вероятно, самым простым способом является использование стандартных функций ANSI lag() и/или lead():

select count(*) 
from (select t.*, 
      lead(value) over (order by id) as next_value, 
      lead(value, 2) over (order by id) as next_value2, 
     from t 
    ) t 
where value = 'A' and next_value = 'B' and next_value2 = 'C'; 
+0

Я не думаю, что это * оптимизированный способ *. – Elyasin

+0

Пока вы не получите другой ответ, это самый «оптимизированный» способ. –

+0

Это работает отлично. Большое спасибо. Это намного более оптимизировано, чем повторение его курсорами, это точно. :) –

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