sql >> Databáze >  >> RDS >> Sqlserver

Jak identifikujete sekvence vzorů záznamů v záznamech pomocí TSQL?

Můžete použít následující dotaz zabalený do CTE abyste hodnotám obsaženým ve vaší sekvenci přiřadili pořadová čísla:

;WITH Seq AS (
    SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn
    FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v)
)

Výstup:

v   rn
-------
5   1
9   2
6   3

Pomocí výše uvedeného CTE můžete identifikovat ostrovy, tj. řezy po sobě jdoucích řádků obsahujících celou sekvenci:

;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

Výstup:

    Key Value   grp
   -----------------
    1   5       0
    2   9       0
    3   6       0
    6   5       3
    7   9       3
    8   6       3

grp pole vám pomůže přesně identifikovat tyto ostrovy.

Vše, co nyní musíte udělat, je pouze odfiltrovat dílčí skupiny:

;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

Ukázka zde

Poznámka: Počáteční verze této odpovědi používala INNER JOIN na Seq . Toto nebude fungovat, pokud tabulka obsahuje hodnoty jako 5, 42, 9, 6 , jako 42 budou odfiltrovány pomocí INNER JOIN a tato sekvence byla falešně označena jako platná. Za tuto úpravu patří @HABO.



  1. Jak mohu vytvořit instalační program pro web. PHP mysql

  2. PHP PDO a MySQLi

  3. Jak změnit pořadové číslo databázového poštovního účtu v profilu v SQL Server (T-SQL)

  4. Chyba 1329:Žádná data – nebylo načteno, vybráno ani zpracováno nula řádků – i když je vše hotovo