2017-10-19 2 views
1

eine postgresql Abfrage Angenommen, Ausgabereihen 2 Spalten von denen jedes Array von int [] [2]pg Entfernen gemeinsamen Teil in Array

  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}................} 

Wie können wir die führenden Arrays, die in beiden Spalten mit Ausnahme der letzten entfernen ein? In der ersten Zeile sollte {1,2} aus den beiden Spalten entfernt werden. In der zweiten Zeile sollte {13,14},{1,2} aus den beiden Spalten entfernt werden.

Kann es mit SQL getan werden oder ist es notwendig, plpgsql zu verwenden?

Ich könnte die plpgsql verwalten, aber möchte sql-Lösung.

Antwort

0

gegeben Ihrer Probe ohne Lücken in Folge von gleich Paaren,

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) 

Sie Teil Komplikation überspringen, wenn Sie einen Streich für multidimentional Arrays hinzufügen, suchen here und here

Verwandte Themen