È possibile utilizzare la seguente query avvolto in un CTE
al fine di assegnare i numeri di sequenza ai valori contenuti nella sequenza:
;WITH Seq AS (
SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn
FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v)
)
uscita:
v rn
-------
5 1
9 2
6 3
Utilizzando quanto sopra CTE
puoi identificare le isole, cioè le sezioni di righe sequenziali contenenti l'intera sequenza:
;WITH Seq AS (
SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn
FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v)
), Grp AS (
SELECT [Key], [Value],
ROW_NUMBER() OVER (ORDER BY [Key]) - rn AS grp
FROM mytable AS m
LEFT JOIN Seq AS s ON m.Value = s.v
)
SELECT *
FROM Grp
uscita:
Key Value grp
-----------------
1 5 0
2 9 0
3 6 0
6 5 3
7 9 3
8 6 3
grp
campo consente di identificare esattamente queste isole.
Tutto quello che dovete fare ora è quello di filtrare appena fuori gruppi parziali:
;WITH Seq AS (
SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn
FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v)
), Grp AS (
SELECT [Key], [Value],
ROW_NUMBER() OVER (ORDER BY [Key]) - rn AS grp
FROM mytable AS m
LEFT JOIN Seq AS s ON m.Value = s.v
)
SELECT g1.[Key], g1.[Value]
FROM Grp AS g1
INNER JOIN (
SELECT grp
FROM Grp
GROUP BY grp
HAVING COUNT(*) = 3) AS g2
ON g1.grp = g2.grp
Demo here
Nota: La versione iniziale di questa risposta utilizzato un INNER JOIN
a Seq
. Ciò non funzionerà se la tabella contiene valori come 5, 42, 9, 6
, poiché 42
verrà filtrato dallo INNER JOIN
e questa sequenza identificata erroneamente come valida. Il credito va a @HABO per questa modifica.
Puoi aggiungere un piccolo testo sul modello: quanto può essere grande? –
Quindi si dovrebbe avere un modello fornito come 'declare @Pattern come tabella (Seq Int, Val Int); inserire in valori @Pattern (Seq, Val) (1, 5), (2, 9), (3, 6); '? Sembra un join con alcuni fantastici numeri, raggruppamenti e conteggi di Row_Number.Una strana variante "lacune e isole" problema a quel punto. – HABO
@BogdanBogdanov Il modello non sarà mai più di 3 numeri sequenziali. In questo caso 5,9 e 6. Idealmente, la soluzione dovrebbe essere in grado di accogliere una sequenza più grande, se necessario, con alcune modifiche. Il valore è di tipo intero. Spero di aver interpretato correttamente la tua domanda. In caso contrario, fatemelo sapere – Mark