PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thu gọn nhiều hàng của mảng nếu các mảng chồng lên nhau

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

SQL Fiddle

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Viết một tệp bằng nhiều chuỗi

  2. Cài đặt Tiện ích mở rộng PostgreSQL cho tất cả các lược đồ

  3. Lỗi drop Rails + Postgres:cơ sở dữ liệu đang được người dùng khác truy cập

  4. Sử dụng CASE trong PostgreSQL để ảnh hưởng đến nhiều cột cùng một lúc

  5. Tìm tất cả các hàng bằng cách sử dụng một số phạm vi Unicode (chẳng hạn như ký tự Cyrillic) với PostgreSQL?