Tôi đang cố gắng để có được đầu của tôi xung quanh làm điều này vì nó liên quan đến việc so sánh các hàng liên tiếp. Tôi đang cố gắng nhóm các giá trị khác nhau theo một số nhất định. Ví dụ: giả sử tôi có bảng này:Nhận tất cả các hàng liên tiếp khác nhau theo giá trị nhất định?
CREATE TABLE #TEMP (A int, B int)
-- Sample table
INSERT INTO #TEMP VALUES
(3,1),
(3,2),
(3,3),
(3,4),
(5,1),
(6,1),
(7,2),
(8,3),
(8,4),
(8,5),
(8,6)
SELECT * FROM #TEMP
DROP TABLE #TEMP
Và chúng tôi nói rằng tôi phải nhóm tất cả các giá trị khác nhau 1 có cùng giá trị cho A. Sau đó, tôi cố gắng để có được kết quả như sau:
A B GroupNo
3 1 1
3 2 1
3 3 1
3 4 1
5 1 2
6 1 3
7 2 4
8 3 5
8 4 5
8 5 5
8 6 5
(3,1) (3,2) (3,3) (3,4)
và (8,3) (8,4) (8,5) (8,6)
đã được đưa vào cùng một nhóm bởi vì chúng khác nhau bởi một giá trị 1. đầu tiên tôi sẽ cho nỗ lực của tôi:
CREATE TABLE #TEMP (A int, B int)
-- Sample table
INSERT INTO #TEMP VALUES
(3,1), (3,2), (3,3), (3,4), (5,1), (6,1), (7,2),
(8,3), (8,4), (8,5), (8,6)
-- Assign row numbers and perform a left join
-- so that we can compare consecutive rows
SELECT ROW_NUMBER() OVER (ORDER BY A ASC) ID, *
INTO #TEMP2
FROM #TEMP
;WITH CTE AS
(
SELECT X.A XA, X.B XB, Y.A YA, Y.B YB
FROM #TEMP2 X
LEFT JOIN #TEMP2 Y
ON X.ID = Y.ID - 1
WHERE X.A = Y.A AND
X.B = Y.B - 1
)
SELECT XA, XB
INTO #GROUPS
FROM CTE
UNION
SELECT YA, YB
FROM CTE
ORDER BY XA ASC
-- Finally assign group numbers
SELECT X.XA, X.XB, Y.GID
FROM #GROUPS X
INNER JOIN
(SELECT XA, ROW_NUMBER() OVER (ORDER BY XA ASC) GID
FROM #GROUPS Y
GROUP BY XA
) Y
ON X.XA = Y.XA
DROP TABLE #TEMP
DROP TABLE #TEMP2
DROP TABLE #GROUPS
tôi sẽ làm điều này trên bảng lớn (khoảng 30 triệu hàng) vì vậy tôi hy vọng có một cách tốt hơn để làm điều này cho các giá trị tùy ý (ví dụ, không chỉ khác nhau 1, nhưng nó có thể là 2 hoặc 3 mà tôi sẽ kết hợp sau này vào một thủ tục). Bất kỳ đề xuất nào về việc liệu phương pháp tiếp cận của tôi có bị lỗi và liệu nó có thể được cải thiện không?
+1 Cảm ơn bạn đã dành thời gian! Điều này hoạt động như tôi muốn. Tôi sẽ kiểm tra hiệu suất trên cái này và quay lại. Cách tiếp cận của tôi gần như tương tự nhưng tôi đã lo lắng về nhiều lần tham gia. – Legend