列組合資料去重複值

pwz1688發表於2014-09-25
有如下需求,如表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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章