已经有一个类似的问题,但我有几个不同
我有这张表>>
No1 No2 Data Customer
1 2 01.01.2013 120000
2 1 01.02.2013 100000
3 4 03.06.2011 150000
4 3 05.09.2010 160000
5 6 15.02.2013 110000
6 5 29.06.2014 190000
1 6 19.05.2013 100000
6 1 04.08.2013 120000
9 2 01.07.2011 100000
我想要的是消除具有相同值但在另一个字段中的行。对我来说No1 = 1 No2 = 2而No1 = 2 No2 = 1是一回事。因此,当这种组合出现时,它应该只返回一行。
最后我希望将此作为结果>>
No1 No2 Data Customer
1 2 01.01.2013 120000
3 4 03.06.2011 150000
5 6 15.02.2013 110000
1 6 19.05.2013 100000
9 2 01.07.2011 100000
我找到了一个解决方案,但仅针对前两列
select distinct least(no1, no2), greatest(no1, no2)
from t
但我需要'数据'和'客户'列也
如果我尝试
select distinct least(no1, no2), greatest(no1, no2), max(Data), max(Customer)
from t
它会给我数据和客户的最大值,但我希望值对应/匹配行..
我的真实表实际上是从包含子查询的大量表中选择的,因此获得结果非常耗时,这就是为什么我想要最简单,最快速的解决方案。
赞赏任何提示/建议
感谢 IV
- 编辑 - / 6小时后/
我忘了提到我有没有组合的单行,就像我刚刚在原始表格中填写的那些(表格中的最后一个:) :)
所以我发现听到了一个帮助我做到这一点的答案
select t1.*
from MyTable t1
left outer join MyTable t2 on t1.No1 = t2.No2 and t1.No2 = t2.No1
where t2.No2 is null --- this will give me the singles
or t1.No1 <= t2.No1 --- and this will give me one row where the combination occures
非常感谢你们所有人 IV
答案 0 :(得分:1)
这样的事情应该适用于Oracle。没有要测试的数据库,因此它将包含语法错误。
select * from (
select least(no1, no2), greatest(no1, no2), Data, Customer,
rank() over (partition by least(no1, no2), greatest(no1, no2)
order by Customer desc) r
from t
) where r = 1
答案 1 :(得分:0)
select *
from the_table
where (no1, no2) in (select distinct least(no1, no2), greatest(no1, no2)
from the_table);
如果组合(no1, no2)
不是唯一的,则会返回重复项,例如如果有多个行,no1 = 1且no2 = 2
答案 2 :(得分:0)
您可以使用MINUS
,这将获得最后一个未耦合的行
SELECT *
FROM Table1
WHERE (No1, No2) IN (SELECT No1, No2
FROM Table1
MINUS
SELECT No2, No1
FROM Table1
WHERE No1 < No2);