2015-12-28 12 views
6

Próbuję znaleźć zoptymalizowany sposób określenia, czy określony zestaw wartości istnieje na liście.Wyszukaj występowanie listy wartości

Na przykład, pozwala zakładać następującą listę rekordów w tabeli

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

Staram się znaleźć sposób, aby sprawdzić, ile razy ciąg {A, B} lub {A, B, C na przykład występuje.

Wiem, że mogę to zrobić za pomocą kursorów, ale sprawdzałem, czy jest jakaś inna opcja, która byłaby lepsza pod względem wydajności.

Wynik będę oczekiwać, że przez coś takiego:

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

Używam SQL Server.

+0

Czy to znaczy bez przerw? –

+0

Używam w tym przypadku serwera SQl. –

+0

Wskazówka: pomocne jest oznaczanie pytań bazy danych za pomocą odpowiedniego oprogramowania (MySQL, Oracle, DB2, ...) i wersji, np. 'sql-server-2014'. Różnice w składni i funkcjach często wpływają na odpowiedzi. – HABO

Odpowiedz

5

Prawdopodobnie Najprostszym sposobem jest użycie standardowych funkcji ANSI lag() i/lub 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

Nie sądzę, że jest to * zoptymalizowany sposób *. – Elyasin

+0

Dopóki nie otrzymasz kolejnej odpowiedzi, jest to najbardziej "zoptymalizowany" sposób. –

+0

To działa dobrze. Dziękuję Ci bardzo. Jest o wiele bardziej zoptymalizowany niż iterowanie go przez kursory, to na pewno. :) –