OK, nó thật khó khăn. Vui lòng xem truy vấn này:
;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
Bạn có thể kiểm tra các CTE khác nhau trong truy vấn ở trên để hiểu cách tôi đưa ra giải pháp. Chìa khóa ở đây là sử dụng toán tử | để hợp nhất các mảng, như trong a.arr | b.arr
Có một truy vấn đệ quy được gọi là cte
đếm sự xuất hiện của mỗi tập hợp trong các nhóm tập hợp khác nhau. Bạn có thể thay thế dòng cuối cùng thành select * from cte order by grp, counter
để xem counter
như thế nào và grp
được thay đổi khi các bộ được tạo đệ quy