;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并在孩子身上引用它。将数据插入到两个表中,并且加入是微不足道的 –