Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để bạn xác định chuỗi mẫu bản ghi trong bản ghi bằng TSQL?

Bạn có thể sử dụng truy vấn sau được bao bọc trong CTE để gán số thứ tự cho các giá trị có trong trình tự của bạn:

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

Đầu ra:

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

Sử dụng CTE ở trên bạn có thể xác định các đảo, tức là các phần của hàng tuần tự chứa toàn bộ chuỗi:

;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

Đầu ra:

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

grp trường giúp bạn xác định chính xác những hòn đảo này.

Tất cả những gì bạn cần làm bây giờ là chỉ lọc ra các nhóm từng phần:

;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 tại đây

Lưu ý: Phiên bản đầu tiên của câu trả lời này sử dụng INNER JOIN thành Seq . Điều này sẽ không hoạt động nếu bảng chứa các giá trị như 5, 42, 9, 6 , là 42 sẽ được lọc ra bởi INNER JOIN và chuỗi này được xác định sai là một chuỗi hợp lệ. Tín dụng được chuyển đến @HABO cho chỉnh sửa này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xoay vòng bằng SQL Server 2000

  2. Tạo Cơ sở dữ liệu SQL Server với SQLOPS

  3. Bộ nhớ cách hiệu quả để đọc dữ liệu BLOB trong C # / SQL 2005

  4. Chuyển đổi ‘datetimeoffset’ thành ‘date’ trong SQL Server (Ví dụ T-SQL)

  5. Cách nhận các hàng có tổng bằng giá trị đã cho