ITPub博客

首页 > 数据库 > Oracle > 列组合数据去重复值

列组合数据去重复值

原创 Oracle 作者:pwz1688 时间:2014-09-25 15:23:14 0 删除 编辑
有如下需求,如表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博客 ” ,链接:https://blog.itpub.net/21251711/viewspace-1280607/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-30

  • 博文量
    106
  • 访问量
    736041