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
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.