sql >> Database >  >> RDS >> PostgreSQL

Vouw meerdere rijen arrays samen als de arrays elkaar overlappen

Oké, het was zwaar. Kijk eens naar deze vraag:

;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

U kunt verschillende CTE's testen in de bovenstaande query om te begrijpen hoe ik tot de oplossing ben gekomen. De sleutel hier is om operator | . te gebruiken om arrays samen te voegen, zoals in a.arr | b.arr

Er is een recursieve zoekopdracht genaamd cte die het voorkomen van elke set binnen verschillende groepen sets telt. U kunt de laatste regel vervangen door select * from cte order by grp, counter om te zien hoe de counter en grp worden gewijzigd wanneer de sets recursief worden gebouwd




  1. Waarom INSERT IGNORE verhoogt de primaire sleutel auto_increment?

  2. TINYTEXT, TEXT, MEDIUMTEXT en LONGTEXT maximale opslaggroottes

  3. Toegang tot docker-container mysql-databases

  4. mysql veel op veel relatie