Как убрать зеркальные результаты в Posgre SQL? - PullRequest
0 голосов
/ 27 февраля 2020

Я не мог понять, как удалить зеркальные результаты, как это:

select
b.column1 as result1,
c.column2 as result2
from table a
left join table b on a.column1 = b.column1
left join table c on a.column2 = c.column1;

Получены следующие результаты:

result1|results2
b1     |b22
b5     |b66
b74    |b31
......
b22    |b1
b66    |b5
b31    |b74

Как я могу получить только первый комбинация - если есть комбинация b1-b22, мне не нужен b22-b1.

Я пробовал, что отличается от суммы b.column1 и c .column1 - я привел их к int, и это работает, но я не верю, что это лучший способ, так как могут быть дублированные суммы из разных комбинаций, и я потеряю некоторые данные.

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Это немного сложно, если у вас нет всех комбинаций. Результаты вашего примера не имеют null, поэтому я изменю join s на inner join s, а затем использую distinct on:

select distinct on (least(b.column1, c.column2), greatest(b.column1, c.column2))
       b.column1 as result1, c.column2 as result2
from table a join
     table b
     on a.column1 = b.column1 join
     table c
     on a.column2 = c.column1
order by least(b.column1, c.column2), greatest(b.column1, c.column2);

На самом деле, как ваш запрос сформулирован, join кажется, не нужны вообще. Итак, вы можете рассмотреть:

select distinct on (least(a.column1, a.column2), greatest(a.column1, a.column2))
       a.column1 as result1, a.column2 as result2
from table a
order by least(a.column1, a.column2), greatest(a.column1, a.column2);
0 голосов
/ 28 февраля 2020

«Удалить результаты зеркала», которое звучит так, как будто вы хотите удалить. Это, кажется, лучше всего решать с помощью предложения Exists:

delete from rtab r1
 where r1.result1 > r1.result2 
   and exists (select null 
                 from rtab r2
                where r1.result1 = r2.result2
                  and r1.result2 = r2.result1
               );
0 голосов
/ 27 февраля 2020

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

select
    b.column1 as result1,
    c.column2 as result2
from table a
left join table b on a.column1 = b.column1
left join table c on a.column2 = c.column1 and b.column1 < c.column2
...