2017-10-19 5 views
1

Supposons une requête postgresql que les lignes de sortie de 2 colonnes chaque tableau étant d'int [] [2]pg enlever une partie commune dans le tableau

  track0       track1 
{{1,2},{5847,5848},{5845,5846}......} {{1,2},{5847,5848},{10716,10715}........} 

{{13,14},{1,2},{5847,5848},{284,285}........} {{13,14},{1,2},{5847,5848},{1284,1285}................} 

Comment peut-on supprimer les tableaux principaux communs aux deux colonnes, sauf la dernière un? Dans la première rangée {1,2} devrait être retiré des deux colonnes. Dans la deuxième rangée {13,14},{1,2} devrait être retiré des deux colonnes. Peut-il être fait avec sql ou faut-il utiliser plpgsql?

Je pourrais gérer le plpgsql mais voudrait la solution de sql.

Répondre

0

donné votre échantillon sans lacunes dans l'ordre de paires égales,

t=# with d(t0,t1) as (values 
     ('{{1,2},{5847,5848},{5845,5846}}'::int[][2],'{{1,2},{5847,5848},{10716,10715}}'::int[][2]) 
    , ('{{13,14},{1,2},{5847,5848},{284,285}}'::int[][2],'{{13,14},{1,2},{5847,5848},{1284,1285}}'::int[][2]) 
    ) 
    , u as (
     select * 
     from d 
     join unnest(t0) with ordinality t(e0,o0) on true 
     left outer join unnest(t1) with ordinality t1(e1,o1) on o0=o1 
    ) 
    , p as (
    select * 
    , case when (
     not lead(e0=e1) over w 
     or not lead(e0=e1,2) over w 
     or e0!=e1 
    ) AND (o1%2) = 1 
     then ARRAY[e0,lead(e0) over w] end r0 
    , case when (
     not lead(e0=e1) over w 
     or not lead(e0=e1,2) over w 
     or e0!=e1 
    ) AND (o1%2) = 1 
     then ARRAY[e1,lead(e1) over w] end r1 
    from u 
    window w as (partition by t0,t1 order by o0) 
    ) 
    select t0,t1,array_agg(r0),array_agg(r1) 
    from p 
    where r0 is not null or r1 is not null 
    group by t0,t1 
    ; 
        t0     |     t1     |   array_agg   |   array_agg 
---------------------------------------+-----------------------------------------+---------------------------+----------------------------- 
{{13,14},{1,2},{5847,5848},{284,285}} | {{13,14},{1,2},{5847,5848},{1284,1285}} | {{5847,5848},{284,285}} | {{5847,5848},{1284,1285}} 
{{1,2},{5847,5848},{5845,5846}}  | {{1,2},{5847,5848},{10716,10715}}  | {{5847,5848},{5845,5846}} | {{5847,5848},{10716,10715}} 
(2 rows) 

vous pouvez sauter une partie de complications si vous ajoutez un truc pour les tableaux multidimentionnelle, regardez here et here