Sql-Server
如何將成對的 id 值聚合成組
我有一個包含兩個 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