Sql-Server

如何將成對的 id 值聚合成組

  • August 28, 2020

我有一個包含兩個 id 列 id1 和 id2 的表。每行顯示 2 個 id 值已連結在一起。我的實際數據有兩個 id 列作為 varchar(20) 但我在下面的範例中使用整數來說明問題。

id1 id2
--- ---
1    2
1    3
3    4
3    5
6    7

我想將 id 組合在一起,以便即使 2 個 id 值之間沒有直接連結,所有連結的 id 也可以組合在一起。

id group_id
-- ----
1   1
2   1
3   1
4   1
5   1
6   2
7   2   

如果可能的話,我想在不使用游標的情況下在 sql 中實現這一點。

感謝所有的建議。

更新:我認為在它所代表的數據上添加更多背景會很有用。數據代表來自不同數據源的企業記錄

主表看起來像這樣

id business_name postal_address business_classification x y group_id

主表可以包含需要關聯的重複/相似記錄。具有 id1 和 id2 列的表是使用模糊字元串匹配(levenshtein、單詞匹配等)和空間鄰近匹配進行去重的結果。我認為這個表實際上是一個無向圖,包含許多斷開連接的子圖,例如 group_id 1 和 2。我想加入同一網路中的所有 id 並更新主表中的 group_id。

我認為現在的問題是如何使用 SQL server Find All Disconnected Sub Graphs - Java辨識圖上所有斷開連接的子圖

好吧,這適用於給定的樣本數據,但不適用於循環場景/可能不適用於更複雜的數據集。以為我會發布作為 10 的首發:

DECLARE @t TABLE ( id1 INT, id2 INT )

INSERT INTO @t VALUES
   ( 1, 2 ),
   ( 1, 3 ),
   ( 3, 4 ),
   ( 3, 5 ),
   ( 6, 7 )

   --( 1, 2 ),
   --( 2, 3 ),
   --( 3, 1 )

;WITH cte AS
(
SELECT ROW_NUMBER() OVER( ORDER BY id1 ) group_id, id1 id 
FROM @t a
   CROSS APPLY ( SELECT TOP 1 id2 FROM @t c WHERE a.id1 = c.id1 ) d 
WHERE NOT EXISTS ( SELECT * FROM @t b WHERE a.id1 = b.id2 )
 AND a.id2 = d.id2
UNION ALL
SELECT group_id, t.id2
FROM cte c
   INNER JOIN @t t ON c.id = t.id1
)
SELECT *
FROM cte
ORDER BY 1, 2

引用自:https://dba.stackexchange.com/questions/61813