2015-12-28 10 views
6

Sto cercando di trovare un modo ottimizzato per identificare se un insieme specifico di valori esiste in un elenco.Ricerca dell'occorrenza di un elenco di valori

Per esempio, lascia supporre il seguente elenco di record di una tabella

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

Sto cercando di trovare un modo per controllare quanto i tempi della successione {A, B} o {A, B, C} si verifica, per esempio.

So che posso farlo con i cursori ma stavo controllando se ci fosse qualche altra opzione che sarebbe preferibile in termini di prestazioni.

Il risultato mi aspetto sarebbe da qualcosa di simile:

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

Sto utilizzando SQL Server.

+0

vuoi dire senza spazi? –

+0

In questo caso sto utilizzando il server SQl. –

+0

Suggerimento: è utile contrassegnare le domande del database con il software appropriato (MySQL, Oracle, DB2, ...) e la versione, ad es. 'Sql-server-2014'. Le differenze di sintassi e funzionalità spesso influenzano le risposte. – HABO

risposta

5

Probabilmente il modo più semplice è quello di utilizzare le funzioni standard ANSI lag() e/o 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

Non penso che sia un * modo ottimizzato *. – Elyasin

+0

Fino a quando non ottieni un'altra risposta, questo è il modo più "ottimizzato" –

+0

Che funziona bene. Grazie mille. È molto più ottimizzato di iterarlo con i cursori, questo è certo. :) –