SQL不同的对分组

时间:2015-09-30 00:09:33

标签: sql

我有兴趣像这样操纵我的数据:

我的来源数据:

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]

但是唉,它删除了所有匹配的对。

3 个答案:

答案 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);

注意:我没有在fromto周围添加转义字符,尽管您在实际查询中需要它们。

答案 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)