简体   繁体   中英

Oracle SQL - Listagg with Rtrim and Regexp - Duplicates still present

I am using LISTAGG with RTRIM and REGEXP_REPLACE to create a comma delimited list of Test Scores but remove duplicates.

The problem is that there are still duplicates.

The data given below is directly from the SORTEST table. (SELECT * FROM SORTEST WHERE SORTEST_PIDM = '260670') I did eliminate the columns I am not using.

Q1: Why are there duplicates?

Q2: How can they be eliminated?

I think it may have to do with there being two sets of A01-A05 scores. It only happens on persons with more than one set of A scores. This does not make sense to me though since I am looking for scores LIKE 'A%B'

CODE:

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')

Data Please note that SORTEST_PIDM = SPRIDEN_PIDM. I did not include the SPRIDEN ID or name because I wanted to simplify the data section.

+--------------+-------------------+-------------------+--------------------+
| 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 |
+--------------+-------------------+-------------------+--------------------+

Results:

+------------+--------------+--------+--------+------------------------------------------------+
| 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                         |
+------------+--------------+--------+--------+------------------------------------------------+

These are my Desired Results:

+------------+--------------+--------+--------+--------------------------------------------+
| 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                     |
+------------+--------------+--------+--------+--------------------------------------------+

Oracle Setup :

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;

Query :

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;

Results :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM