列组合数据去重复值

有如下需求,如表T中有三个字段a,b,c且对应数据如下:
A     B       10
B     A       10
A     C       20
A     D       20
D     A       20
对A列数据和B列数据组合相同剔重,如前二行数据,a列值与b列值互等,则保留一行即可,去重后数据结果如下:
A     B       10
A     C       20
A     D       20

表初始化脚本如下:

SQL> create table t as
  2  SELECT 'A' A,'B' B, '10' C FROM DUAL UNION ALL
  3  SELECT 'B','A', '10' FROM DUAL UNION ALL
  4  SELECT 'A','C', '20' FROM DUAL UNION ALL
  5  SELECT 'A','D', '20' FROM DUAL UNION ALL
  6  SELECT 'D','A', '20' from dual;

表已创建。

SQL> select * from t;

A B C
- - --
A B 10
B A 10
A C 20
A D 20
D A 20

解决方法一:

SQL> SELECT least(a, b), greatest(a, b), MAX(c)
  2    FROM t
  3   GROUP BY least(a, b), greatest(a, b);

L G MA
- - --
A C 20
A D 20
A B 10


解决方法二:

SQL> SELECT MIN(a), MAX(b), MAX(c)
  2    FROM t
  3   GROUP BY CASE
  4              WHEN a < b THEN
  5               a || chr(10) || b
  6              ELSE
  7               b || chr(10) || a
  8            END;

M M MA
- - --
A B 10
A C 20
A D 20


解决方法三:

SQL> SELECT a, b, c
  2    FROM (SELECT a,
  3                 b,
  4                 c,
  5                 row_number() over(PARTITION BY c, greatest(a, b), least(a, b
) ORDER BY c) rn
  6            FROM t)
  7   WHERE rn = 1
  8  ;

A B C
- - --
A B 10
A C 20
A D 20

SQL>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21251711/viewspace-1280607/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21251711/viewspace-1280607/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值