我有兴趣像这样操纵我的数据:
我的来源数据:
From | To | Rate
----------------
EUR | AUD | 1.5895
EUR | BGN | 1.9558
EUR | GBP | 0.7347
EUR | USD | 1.1151
GBP | AUD | 2.1633
GBP | BGN | 2.6618
GBP | EUR | 1.3610
GBP | USD | 1.5176
USD | AUD | 1.4254
USD | BGN | 1.7539
USD | EUR | 0.8967
USD | GBP | 0.6589
关于"不同的对",我认为以下是"重复"。
EUR | USD matches USD | EUR
EUR | GBP matches GBP | EUR
GBP | USD matches USD | GBP
我希望过滤我的源数据,以便删除上述任何一个"重复",这样我的最终表格比原始数据少3个记录。我不关心来自"重复的记录"保留或删除,只要选择只有1。
我尝试了很多种类的连接,存在,除外,独特,分组,逻辑比较(<>),我觉得我对任何给定的方法都如此接近......但它似乎似乎没有点击。
我最喜欢的努力涉及内部加入除了:
SELECT a.[FROM], a.[TO], a.[Rate]
FROM Table a
INNER JOIN
(
SELECT DISTINCT [From], [To]
FROM Table
EXCEPT
(
SELECT [TO] as [From], [From] as [To]
FROM Table
)
) b
ON a.[From] = b.[From] AND a.[To] = b.[To]
但是唉,它删除了所有匹配的对。
答案 0 :(得分:4)
我可以提出一些非常简单的建议,如果你想要哪一个并不重要,那么你只能选择他的速率大于1的那个,或者相反的那个小一个。每个削减应该是1个更大的速率和一个更小的(有意义)所以
Select * from table where rate>1
答案 1 :(得分:2)
删除不依赖于费率的重复项的一种方法:
select s.*
from source s
where from < to
union all
select s.*
from source s
where to > from and
not exists (select 1 from source s2 where s.from = s2.to and s.to = s2.from);
注意:我没有在from
和to
周围添加转义字符,尽管您在实际查询中需要它们。
答案 2 :(得分:1)
只是为了完成DISTINCT ON
解决方案:
SELECT DISTINCT ON(Least(from, to), Greatest(from, to)) *
FROM
source AS s1
ORDER BY Least(from, to), Greatest(from, to)