Bạn có thể sử dụng các truy vấn sau đây được bao bọc trong một CTE
để gán số thứ tự với các giá trị chứa trong chuỗi 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)
)
Output:
v rn
-------
5 1
9 2
6 3
Sử dụng trên CTE
bạn có thể xác định các hòn đảo, tức là các lát của các hàng tuần tự có 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
Output:
Key Value grp
-----------------
1 5 0
2 9 0
3 6 0
6 5 3
7 9 3
8 6 3
grp
lĩnh vực giúp bạn xác định chính xác những hòn đảo này.
Tất cả bạn cần làm bây giờ là chỉ lọc ra nhóm 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 here
Lưu ý: Phiên bản ban đầu của câu trả lời này đã sử dụng một INNER JOIN
để 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
, dưới dạng 42
sẽ được lọc theo INNER JOIN
và chuỗi này được xác định sai là giá trị hợp lệ. Tín dụng chuyển đến @HABO cho chỉnh sửa này.
Bạn có thể thêm một đoạn văn bản nhỏ về mẫu đó - nó có thể lớn đến mức nào không? –
Vì vậy, bạn sẽ có một mẫu được cung cấp như 'declare @Pattern dưới dạng bảng (Seq Int, Val Int); chèn vào các giá trị @Pattern (Seq, Val) (1, 5), (2, 9), (3, 6); '? Có vẻ như tham gia với một số đối sánh, nhóm và số lượng Row_Number ưa thích.Một biến thể kỳ lạ "khoảng trống và đảo" vấn đề tại thời điểm đó. – HABO
@BogdanBogdanov Mẫu sẽ không bao giờ có nhiều hơn 3 số liên tiếp. Trong trường hợp này là 5,9 và 6. Nhưng lý tưởng, giải pháp sẽ có thể chứa một chuỗi lớn hơn nếu cần thiết với một số sửa đổi. Giá trị là số nguyên. Hy vọng rằng, tôi đã giải thích câu hỏi của bạn đúng cách. Nếu không, vui lòng cho tôi biết – Mark