2016-02-03 23 views
0

我正在使用LISTAGG與RTRIM和REGEXP_REPLACE創建測試分數的逗號分隔列表,但除去重複項。Oracle SQL - 帶Rtrim和Regexp的Listagg - 重複仍然存在

問題是仍然有重複。

下面給出的數據直接來自SORTEST表格。 (SELECT * FROM SORTEST WHERE SORTEST_PIDM ='260670')我確實消除了我沒有使用的列。

Q1:爲什麼會有重複?

問題二:如何消除它們?

我認爲這可能與兩組A01-A05得分有關。它只發生在擁有多組A分數的人身上。

SELECT DISTINCT 
SP.SPRIDEN_ID AS "STUDENT_ID", 
t2.sortest_pidm, 
SP.SPRIDEN_LAST_NAME AS "LAST", 
SP.SPRIDEN_FIRST_NAME AS "FIRST", 
RTRIM(
REGEXP_REPLACE(
(
listagg ((T2.SORTEST_TESC_CODE || '-' || T2.SORTEST_TEST_SCORE), ', ') 
WITHIN GROUP (ORDER BY SP.SPRIDEN_ID) 
OVER (PARTITION BY SP.SPRIDEN_ID)), 
      '([^-]*)(-\1)+($|-)', 
      '\1\3'), 
     '-') TEST 
FROM 
SPRIDEN SP 
left outer join SPBPERS B on SP.spriden_pidm = b.spbpers_pidm 
JOIN SORTEST T2 ON T2.SORTEST_PIDM = SP.SPRIDEN_PIDM 
WHERE 
SP.SPRIDEN_CHANGE_IND IS NULL 
AND B.SPBPERS_DEAD_IND IS NULL 
AND B.SPBPERS_CONFID_IND <> 'Y' 
AND T2.SORTEST_TADM_CODE IS NULL 
AND 
T2.SORTEST_TESC_CODE IN ('CM1B', 'CM2B', 'CR1B', 'CW1B', 'A01B', 'A02B', 'A03B', 'A04B', 
         'A05B', 'S01B', 'S02B', 'S95B', 'DSPW', 'DSPR', 'DSPM') 
         AND sP.spriden_change_ind is null 
AND SP.SPRIDEN_ID IN ('A00154876') 

數據 請注意,SORTEST_PIDM = SPRIDEN_PIDM:雖然因爲我在尋找得分LIKE '%A'

CODE這是沒有道理給我。我沒有包含SPRIDEN ID或名稱,因爲我想簡化數據部分。

 
+--------------+-------------------+-------------------+--------------------+ 
| SORTEST_PIDM | SORTEST_TESC_CODE | SORTEST_TEST_DATE | SORTEST_TEST_SCORE | 
+--------------+-------------------+-------------------+--------------------+ 
|    |     |     |     | 
|  260670 | A01    | 1-Mar-12   |     20 | 
|  260670 | A01    | 1-Oct-12   |     22 | 
|  260670 | A01B    | 9-Jan-13   |     22 | 
|  260670 | A02    | 1-Mar-12   |     19 | 
|  260670 | A02    | 1-Oct-12   |     19 | 
|  260670 | A02B    | 5-Jun-12   |     19 | 
|  260670 | A03    | 1-Mar-12   |     21 | 
|  260670 | A03    | 1-Oct-12   |     19 | 
|  260670 | A03B    | 5-Jun-12   |     21 | 
|  260670 | A04    | 1-Mar-12   |     23 | 
|  260670 | A04    | 1-Oct-12   |     22 | 
|  260670 | A04B    | 5-Jun-12   |     23 | 
|  260670 | A05    | 1-Mar-12   |     21 | 
|  260670 | A05    | 1-Oct-12   |     21 | 
|  260670 | A05B    | 5-Jun-12   |     21 | 
|  260670 | DSPM    | 5-Jun-12   |     4 | 
|  260670 | DSPR    | 5-Jun-12   |     4 | 
|  260670 | DSPW    | 5-Jun-12   |     4 | 
+--------------+-------------------+-------------------+--------------------+ 

結果:

 
+------------+--------------+--------+--------+------------------------------------------------+ 
| STUDENT_ID | SORTEST_PIDM | LAST | FIRST |     TEST      | 
+------------+--------------+--------+--------+------------------------------------------------+ 
| A00154876 | 260670  | Fowler | Martin | A01B-22, A02B-19, A03B-21, A04B-23, A05B-21, | 
|   |    |  |  | DSPM-4, DSPR-4, DSPW-4,      | 
|   |    |  |  | A01B-22, A02B-19, A03B-21, A04B-23, A05B-21, | 
|   |    |  |  | DSPM-4, DSPR-4, DSPW-4       | 
+------------+--------------+--------+--------+------------------------------------------------+ 

這是我想要的結果:

 
+------------+--------------+--------+--------+--------------------------------------------+ 
| STUDENT_ID | SORTEST_PIDM | LAST | FIRST |     TEST     | 
+------------+--------------+--------+--------+--------------------------------------------+ 
| A00249466 |  260670 | Fowler | Martin | A01B-22, A02B-19, A03B-21,A04B-23, A05B-21,| 
|   |    |  |  | DSPM-4, DSPR-4, DSPW-4      | 
+------------+--------------+--------+--------+--------------------------------------------+ 
+0

不幸的是,我要離開幾天。如果我不回覆你,那就是爲什麼。謝謝! –

回答

2

甲骨文設置

CREATE TABLE SPRIDEN(SPRIDEN_ID, SPRIDEN_PIDM, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME) AS 
SELECT 'A00154876', 260670, 'Fowler', 'Martin' FROM DUAL; 

CREATE TABLE SORTEST (SORTEST_PIDM, SORTEST_TESC_CODE, SORTEST_TEST_DATE, SORTEST_TEST_SCORE) AS 
SELECT 260670, 'A01', DATE '2012-03-1', 20 FROM DUAL UNION ALL 
SELECT 260670, 'A01', DATE '2012-10-1', 22 FROM DUAL UNION ALL 
SELECT 260670, 'A01B', DATE '2013-01-9', 22 FROM DUAL UNION ALL 
SELECT 260670, 'A02', DATE '2012-03-1', 19 FROM DUAL UNION ALL 
SELECT 260670, 'A02', DATE '2012-10-1', 19 FROM DUAL UNION ALL 
SELECT 260670, 'A02B', DATE '2012-06-5', 19 FROM DUAL UNION ALL 
SELECT 260670, 'A03', DATE '2012-03-1', 21 FROM DUAL UNION ALL 
SELECT 260670, 'A03', DATE '2012-10-1', 19 FROM DUAL UNION ALL 
SELECT 260670, 'A03B', DATE '2012-06-5', 21 FROM DUAL UNION ALL 
SELECT 260670, 'A04', DATE '2012-03-1', 23 FROM DUAL UNION ALL 
SELECT 260670, 'A04', DATE '2012-10-1', 22 FROM DUAL UNION ALL 
SELECT 260670, 'A04B', DATE '2012-06-5', 23 FROM DUAL UNION ALL 
SELECT 260670, 'A05', DATE '2012-03-1', 21 FROM DUAL UNION ALL 
SELECT 260670, 'A05', DATE '2012-10-1', 21 FROM DUAL UNION ALL 
SELECT 260670, 'A05B', DATE '2012-06-5', 21 FROM DUAL UNION ALL 
SELECT 260670, 'DSPM', DATE '2012-06-5', 4 FROM DUAL UNION ALL 
SELECT 260670, 'DSPR', DATE '2012-06-5', 4 FROM DUAL UNION ALL 
SELECT 260670, 'DSPW', DATE '2012-06-5', 4 FROM DUAL; 

查詢

SELECT DISTINCT 
     SP.SPRIDEN_ID AS "STUDENT_ID", 
     t2.sortest_pidm, 
     SP.SPRIDEN_LAST_NAME AS "LAST", 
     SP.SPRIDEN_FIRST_NAME AS "FIRST", 
     listagg (T2.SORTEST_TESC_CODE || '-' || T2.SORTEST_TEST_SCORE, ', ') 
      WITHIN GROUP (ORDER BY T2.SORTEST_TESC_CODE, T2.SORTEST_TEST_SCORE) 
      OVER (PARTITION BY SP.SPRIDEN_ID) AS TEST 
FROM SPRIDEN SP 
     JOIN (SELECT DISTINCT 
         SORTEST_PIDM, 
         SORTEST_TESC_CODE, 
         SORTEST_TEST_SCORE 
       FROM SORTEST 
       WHERE SORTEST_TESC_CODE IN ('CM1B', 'CM2B', 'CR1B', 'CW1B', 'A01B', 'A02B', 'A03B', 'A04B', 'A05B', 'S01B', 'S02B', 'S95B', 'DSPW', 'DSPR', 'DSPM')) T2 
     ON T2.SORTEST_PIDM = SP.SPRIDEN_PIDM; 

結果

STUDENT_ID SORTEST_PIDM LAST FIRST TEST 
---------- ------------ ------ ------ -------------------------------------------------------------------- 
A00154876  260670 Fowler Martin A01B-22, A02B-19, A03B-21, A04B-23, A05B-21, DSPM-4, DSPR-4, DSPW-4 
+0

@mto謝謝。我能夠得到我需要的結果。我甚至不需要Regexp! –