sql >> Database >  >> RDS >> Sqlserver

Hoe identificeer je recordpatroonreeksen in records met behulp van TSQL?

U kunt de volgende query gebruiken, verpakt in een CTE om volgnummers toe te kennen aan de waarden in uw reeks:

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

Uitvoer:

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

Met behulp van de bovenstaande CTE u kunt eilanden identificeren, d.w.z. segmenten van opeenvolgende rijen die de hele reeks bevatten:

;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

Uitvoer:

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

grp field helpt u deze eilanden precies te identificeren.

Het enige dat u nu hoeft te doen, is om gedeeltelijke groepen eruit te filteren:

;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 hier

Opmerking: De eerste versie van dit antwoord gebruikte een INNER JOIN naar Seq . Dit werkt niet als de tabel waarden bevat zoals 5, 42, 9, 6 , als 42 wordt uitgefilterd door de INNER JOIN en deze reeks ten onrechte geïdentificeerd als een geldige. Krediet gaat naar @HABO voor deze bewerking.



  1. Hoe kan ik het SQL-uitvoeringsplan in Oracle zien?

  2. MYSQL-trigger wordt automatisch verwijderd

  3. Index van ingevoegde rijen ophalen uit een MySQL-database

  4. Is het mogelijk om een ​​record van de ene tabel naar de andere te verplaatsen met een enkele SQL-instructie?