PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zwiń wiele wierszy tablic, jeśli tablice nakładają się

OK, było ciężko. Proszę spojrzeć na to zapytanie:

;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

Skrzypce SQL

Możesz przetestować różne CTE w powyższym zapytaniu, aby zrozumieć, w jaki sposób wymyśliłem rozwiązanie. Kluczem tutaj jest użycie operatora | scalić tablice, jak w a.arr | b.arr

Istnieje rekurencyjne zapytanie o nazwie cte która zlicza występowanie każdego zestawu w różnych grupach zestawów. Możesz zastąpić ostatnią linię, aby select * from cte order by grp, counter aby zobaczyć, jak counter i grp są zmieniane, gdy zestawy są budowane rekursywnie




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sqoop w usłudze Hadoop:NoSuchMethodError:com.google.common.base.Stopwatch.createStarted()

  2. Jak włączyć profiler funkcji PostgreSQL?

  3. Uzyskaj liczbę rekordów, których dotyczy INSERT lub UPDATE w PostgreSQL

  4. Całkowita liczba 1 w masce bitowej Postgres

  5. Operator ALL w klauzuli WHERE w Rails