删除出现在不同列中的重复值,而不是相同的顺序

时间:2017-03-22 10:44:17

标签: sql postgresql graph

我正在尝试在类似图表的表格中整合数据。基本上,我在顶点之间转换了一些值,我想在同一行中检索唯一的顶点对,边缘值显示为列。对于每对,我有两个记录:从 A 边缘过渡到 B 边缘,从 B 边缘过渡到 A < / strong> edge,我想将它们合并为一行。

我试着通过例子来解释它。

我们说我有一张具有以下结构的表:

| column1 | column2 | column3 |
| ------- | ------- | ------- |
|    A    |    B    |    1    |
| ------- | ------- | ------- |
|    B    |    A    |    2    |
| ------- | ------- | ------- |
|    A    |    C    |    3    |
| ------- | ------- | ------- |
|    C    |    A    |    4    |
| ------- | ------- | ------- |

我希望我的最终输出为:

| column1 | column2 | column3 | column4 |
| ------- | ------- | ------- | ------- |
|    A    |    B    |    1    |    2    |
|    A    |    C    |    3    |    4    |

我正在使用的查询给了我正确的结构,但是我遇到了重复记录的问题:

SELECT
    t.column1, t.column2, t.column3, t2.column3 as column4
FROM my_table t INNER JOIN my_table t2
  ON t.column1=t2.column2 AND t.column2=t2.column1;

这就是我的结果:

| column1 | column2 | column3 | column4 |
| ------- | ------- | ------- | ------- |
|    A    |    B    |    1    |    2    |
|    A    |    C    |    3    |    4    |
|    B    |    A    |    2    |    1    |
|    C    |    A    |    4    |    3    |

有关如何处理此问题或删除重复记录的任何想法?

1 个答案:

答案 0 :(得分:1)

许多数据库支持least()greatest()函数。有了这些,您可以这样做:

select least(column1, column2) as column1,
       greatest(column1, column2) as column2,
       min(column3) as column3,
       (case when min(column3) <> max(column3) then max(column3) end) as column4
from my_table t
group by least(column1, column2), greatest(column1, column2);