Postgresql удалить повторяющиеся пары - PullRequest
0 голосов
/ 18 октября 2018

У меня есть эта таблица:

 origin     destination

new york      seattle
new york      chicago
new york      portland
seattle       new york
seattle       chicago
chicago       new york

Я должен построить график, поэтому мне нужно удалить все дублированные обратные пары, чтобы иметь:

origin      destination oneway

new york      seattle     0
new york      chicago     0
new york      portland    1
seattle       chicago     1

Я уже читал этот пост: SQL - Удалить дублирующиеся пары , но это бесполезно для меня, потому что я подал строку.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Один вариант с row_number и count с использованием least и greatest.

select origin,dest,case when cnt_per_pair=1 then 1 else 0 end as one_way
from (select t.*,row_number() over(partition by least(origin,dest),greatest(origin,dest) 
                                   order by dest) as rnum,
      count(*) over(partition by least(origin,dest),greatest(origin,dest)) as cnt_per_pair
      from tbl t
     ) t
where rnum=1
0 голосов
/ 18 октября 2018

Один метод использует агрегирование:

select origin, destination,
       (case when exists (select 1
                          from t t2
                          where t2.origin = t.destination and t2.destination = t.origin
                         )
             then 0 else 1
        end) as one_way
from t
where origin < destination
union all
select origin, destination, 1
from t
where origin > destination;

Альтернативный метод использует оконные функции:

select origin, destination, (cnt = 1)::int as one_way
from (select t.*,
             count(*) over (partition by least(origin, destination), greatest(origin, destination)) as cnt
      from t
     ) t
where origin < destination or
      (origin > destination and cnt = 1);
...