PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Свиване на няколко реда от масиви, ако масивите се припокриват

Добре, беше трудно. Моля, погледнете тази заявка:

;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

Можете да тествате различни CTE в заявката по-горе, за да разберете как стигнах до решението. Ключът тук е да използвате оператор | за обединяване на масиви, както в a.arr | b.arr

Има рекурсивна заявка, наречена cte който отчита появата на всеки набор в различни групи набори. Можете да замените последния ред с select * from cte order by grp, counter за да видите как counter и grp се променят, когато наборите се изграждат рекурсивно




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проблеми със сериен тип данни в DBeaver &PostgreSQL

  2. Опции за архивиране в облак за PostgreSQL

  3. PostgreSQL заявка за списък с разрешени стойности в ограничение?

  4. Postgres масив json последна дата

  5. Ръководство за Pgpool за PostgreSQL:Част първа