所以,你想要遞歸地替換組中的任何項目 - 列中的任何值與列中的值爲1的其他行中找到?至少可以這樣來做:
- 斯普利特資料列,所以只是COLUMN1 - >組關係
- 獲取,可以用來作爲根節點的任何值,我的做法爲最小值,因爲你的數據有一個圓(3323052 - > 3324794 - > 3323052)
- 獲取遞歸都可以從層次結構這些根節點下找到了價值
- 把它放回一起放入原始格式
本例使用DelimitedSplit8k傑夫MODEN:
-- Step 1:
select distinct
d.column1,
convert(int, s.Item) as item
into #tmp
from
data d
cross apply DelimitedSplit8k(d.groups, ',') s
-- Step 2:
select distinct
column1
into #root
from #tmp t1
where not exists
(select 1 from #tmp t2 where t2.item = t1.column1 and t2.item > t2.column1)
-- Step 3:
;with CTE (root, parent, child) as (
select r.column1, r.column1, r.column1 from #root r
union all
select C.root, t.column1, t.item
from CTE C join #tmp t on t.column1 = C.child and t.item > C.parent
)
select distinct * into #results from CTE
-- Step 4:
SELECT r.column1, STUFF((SELECT distinct ', ' + convert(varchar(50), r2.child)
FROM #results r2
WHERE r2.root = r.column1
ORDER BY ', ' + convert(varchar(50), r2.child)
FOR XML PATH(N'')), 1, 2, '') as groups
FROM #root r
GROUP BY column1
ORDER BY column1
結果:
column1 groups
3323052 3323052, 3324794, 3324795, 3763369
3353586 3353586
我用溫度。表確保每個步驟只執行一次,但我相信只需一次選擇並使用CTE而不是臨時表就可以完成整個過程。
可以在SQL Fiddle
什麼需要的組結合後發生在列1值測試呢? –