ठीक है, यह कठिन था। कृपया इस प्रश्न पर एक नज़र डालें:
;with recursive minelem AS(
select arr, MIN(unnest) minel from (select arr, unnest(arr) from test) a group by arr),
testwithrn as(
select arr, row_number() over (order by minel) rn from minelem
),
cte(arr, rn, counter, grp) as(
select arr, rn, 1, 1 from testwithrn where rn = 1
union all
select
case when array_length(a.arr & b.arr, 1) > 0 then a.arr | b.arr else b.arr end,
b.rn,
case when array_length(a.arr & b.arr, 1) > 0 then a.counter + 1 else 1 end,
case when array_length(a.arr & b.arr, 1) > 0 then a.grp else a.grp + 1 end
from cte a inner join testwithrn b
on b.rn > a.rn
),
grouped as(
SELECT arr, counter, grp,
row_number() over (partition by grp order by counter desc) rn from cte)
select distinct arr from grouped where rn = 1
मैं समाधान के साथ कैसे आया, यह समझने के लिए आप ऊपर दिए गए प्रश्न में विभिन्न सीटीई का परीक्षण कर सकते हैं। यहां कुंजी ऑपरेटर का उपयोग करना है | सरणियों को मर्ज करने के लिए, जैसा कि a.arr | b.arr
cte
. नामक एक पुनरावर्ती क्वेरी है जो सेट के विभिन्न समूहों के भीतर प्रत्येक सेट की घटना की गणना करता है। आप अंतिम पंक्ति को select * from cte order by grp, counter
. से बदल सकते हैं यह देखने के लिए कि कैसे counter
और grp
जब सेट पुनरावर्ती रूप से बनाए जाते हैं तो बदल जाते हैं