Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как идентифицирате последователности от модели на записи в записи, използващи TSQL?

Можете да използвате следната заявка, обвита в CTE за да присвоите поредни номера на стойностите, съдържащи се във вашата поредица:

;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   rn
-------
5   1
9   2
6   3

Използвайки горния CTE можете да идентифицирате острови, т.е. части от последователни редове, съдържащи цялата последователност:

;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

Изход:

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

grp полето ви помага да идентифицирате точно тези острови.

Всичко, което трябва да направите сега, е просто да филтрирате частични групи:

;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

Демо тук

Забележка: Първоначалната версия на този отговор използва INNER JOIN към Seq . Това няма да работи, ако таблицата съдържа стойности като 5, 42, 9, 6 , като 42 ще бъдат филтрирани от INNER JOIN и тази последователност е погрешно идентифицирана като валидна. Заслугата е на @HABO за тази редакция.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мога ли да стартирам SSIS пакети с издания на SQL Server Express или Web или Workgroup?

  2. SQL Server - Какво се случва, когато се актуализира ред в таблица?

  3. Как да конвертирате низ в дата/час в SQL Server с помощта на CONVERT()

  4. Моментни снимки на базата данни на SQL Server -2

  5. Как да се свържа с SQL Server 2008 с qt?