PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ciutkan beberapa baris array jika array tumpang tindih

Oke, itu sulit. Silakan lihat kueri ini:

;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

Anda dapat menguji CTE yang berbeda dalam kueri di atas untuk memahami bagaimana saya menemukan solusinya. Kuncinya di sini adalah menggunakan operator | untuk menggabungkan array, seperti pada a.arr | b.arr

Ada kueri rekursif yang disebut cte yang menghitung kemunculan setiap himpunan dalam kelompok himpunan yang berbeda. Anda dapat mengganti baris terakhir menjadi select * from cte order by grp, counter untuk melihat bagaimana counter dan grp diubah ketika set dibangun secara rekursif




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nilai buruk untuk tipe panjang:- Postgresql, Hibernate, Spring

  2. ALL operator dalam klausa WHERE di Rails

  3. Ekspor hasil kueri dari BigQuery ke Postgres

  4. Penjadwal Acara di PostgreSQL?

  5. Memperbarui ResultSets dengan tipe SQL Array di JDBC / PostgreSQL