;WITH cte AS (
SELECT
*
,ROW_NUMBER() OVER (ORDER BY Column2) AS RowNumber
FROM
@Table
)
SELECT
*
,DENSE_RANK() OVER (ORDER BY A27.Column2) as GroupingId
FROM
cte A27
LEFT JOIN cte A28
ON A28.RowNumber IN (a27.RowNumber + 1, a27.RowNumber + 2)
AND A28.Column1 = 'A28'
WHERE
A27.Column1 = 'A27'
因爲根據您的圖像Column3
不是唯一的只有你想要的行號我沒有去使用它的路線。相反,我使用了基於Column2
的ROW_NUMBER
,這似乎是一個增量主鍵,然後是LEFT SELF JOIN
。這是針對每個A27行的2個A28行AFTER
。如果你想「preceding
」喜歡你的OP說,但當時並沒有建議通過簡單地改變JOIN
條件扭轉這種局面:
ON A28.RowNumber IN (a27.RowNumber - 1, a27.RowNumber - 2)
注意我添加了GroupingID
給你的方式識別其中A27和A28的是它們可以一起用作A27表中的新主鍵和A28表中的外鍵以保持關係。
這是我使用的測試數據。
DECLARE @Table AS TABLE (Column1 CHAR(3), Column2 BIGINT, Column3 BIGINT)
INSERT INTO @Table VALUES
('A27',346467408,68723601)
,('A28',346467409,68723601)
,('A28',346467411,68723601)
,('A27',346467413,68723601)
,('A28',346467414,68723601)
,('A28',346467416,68723601)
,('A27',349454768,8908697809)
,('A28',349454769,8908697809)
,('A28',349454771,8908697809)
編輯:根據您如何做時,在單獨的表評論。您可以使用UNION ALL組合表格:
DECLARE @A27 AS TABLE (Column1 CHAR(3), Column2 BIGINT, Column3 BIGINT)
DECLARE @A28 AS TABLE (Column1 CHAR(3), Column2 BIGINT, Column3 BIGINT)
INSERT INTO @A27 VALUES
('A27',346467408,68723601)
,('A27',346467413,68723601)
,('A27',349454768,8908697809)
INSERT INTO @A28 VALUES
('A28',346467409,68723601)
,('A28',346467411,68723601)
,('A28',346467414,68723601)
,('A28',346467416,68723601)
,('A28',349454769,8908697809)
,('A28',349454771,8908697809)
;WITH cteUnion AS (
SELECT
Column1, Column2, Column3
FROM
@A27
UNION ALL
SELECT
Column1, Column2, Column3
FROM
@A28
)
, cteRowNum AS (
SELECT * ,ROW_NUMBER() OVER (ORDER BY Column2) AS RowNumber
FROM
cteUnion
)
SELECT *, DENSE_RANK() OVER (ORDER BY a27.Column2) as GroupingId
FROM
cteRowNum a27
LEFT JOIN cteRowNum a28
ON a28.RowNumber IN (a27.RowNumber + 1, a27.RowNumber + 2)
AND a28.Column1 = 'A28'
WHERE
a27.Column1 = 'A27'
如果表是較大的或者表現可能是你可能想建立一個臨時表,這樣做的一個問題。
IF OBJECT_ID('tempdb..#Combined') IS NOT NULL
BEGIN
DROP TABLE #Combined
END
CREATE TABLE #Combined (
TableName CHAR(3)
,Column2 BIGINT
)
INSERT INTO #Combined (TableName, Column2)
SELECT Column1, Column2
FROM
@A27
INSERT INTO #Combined (TableName, Column2)
SELECT Column1, Column2
FROM
@A28
;WITH cteRowNum AS (
SELECT * ,ROW_NUMBER() OVER (ORDER BY Column2) AS RowNumber
FROM
#Combined
)
SELECT *, DENSE_RANK() OVER (ORDER BY a27.Column2) as GroupingId
FROM
cteRowNum a27
LEFT JOIN cteRowNum a28
ON a28.RowNumber IN (a27.RowNumber + 1, a27.RowNumber + 2)
AND a28.TableName = 'A28'
WHERE
a27.TableName = 'A27'
有點混亂請張貼預期輸出並提及列名稱。 – Susang
從描述中可以看出,表格數據中除了鄰近關係之外,沒有任何關聯父母(A27)和子女(A28)。在Oracle中,數據檢索是非確定性的 - 數據檢索的順序將會更改,除非您指定順序。您沒有可用於訂購的鑰匙,因此會成爲問題。也許SQL Server是不同的。 –
假設你*可以*可靠地將父母連接到孩子,那麼你需要爲每個父母分配一個ID並在孩子身上引用它。將數據插入到兩個表中,並且加入是微不足道的 –