【问题标题】:Oracle SQL - Listagg with Rtrim and Regexp - Duplicates still presentOracle SQL - 带有 Rtrim 和 Regexp 的 Listagg - 仍然存在重复项
【发布时间】:2016-02-03 22:13:53
【问题描述】:

我正在使用带有 RTRIM 和 REGEXP_REPLACE 的 LISTAGG 创建一个以逗号分隔的测试分数列表,但会删除重复项。

问题是仍然存在重复。

下面给出的数据直接来自 SORTEST 表。 (SELECT * FROM SORTEST WHERE SORTEST_PIDM = '260670') 我确实删除了我不使用的列。

Q1:为什么会有重复?

Q2:如何消除?

我认为这可能与有两组 A01-A05 分数有关。它只发生在具有一组以上 A 分数的人身上。这对我来说没有意义,因为我正在寻找像'A%B'这样的分数

代码:

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 = SPIDEN_PIDM。我没有包含 SPRIDEN ID 或名称,因为我想简化数据部分。

+--------------+--------------------+-------------- -----+--------------------+ |排序_PIDM | SORTEST_TESC_CODE | SORTEST_TEST_DATE | SORTEST_TEST_SCORE | +--------------+--------------------+-------------- -----+--------------------+ | | | | | | 260670 | A01 | 2012 年 3 月 1 日 | 20 | | 260670 | A01 | 2012 年 10 月 1 日 | 22 | | 260670 | A01B | 2013 年 1 月 9 日 | 22 | | 260670 | A02 | 2012 年 3 月 1 日 | 19 | | 260670 | A02 | 2012 年 10 月 1 日 | 19 | | 260670 | A02B | 2012 年 6 月 5 日 | 19 | | 260670 | A03 | 2012 年 3 月 1 日 | 21 | | 260670 | A03 | 2012 年 10 月 1 日 | 19 | | 260670 | A03B | 2012 年 6 月 5 日 | 21 | | 260670 | A04 | 2012 年 3 月 1 日 | 23 | | 260670 | A04 | 2012 年 10 月 1 日 | 22 | | 260670 | A04B | 2012 年 6 月 5 日 | 23 | | 260670 | A05 | 2012 年 3 月 1 日 | 21 | | 260670 | A05 | 2012 年 10 月 1 日 | 21 | | 260670 | A05B | 2012 年 6 月 5 日 | 21 | | 260670 |数字处理器 | 2012 年 6 月 5 日 | 4 | | 260670 |数字信号处理器 | 2012 年 6 月 5 日 | 4 | | 260670 |数字信号处理器 | 2012 年 6 月 5 日 | 4 | +--------------+--------------------+-------------- -----+--------------------+

结果:

+------------+--------------+--------+--------+--- ---------------------------------------------+ |学生 ID |排序_PIDM |上一页 |第一 |测试 | +------------+--------------+--------+--------+--- ---------------------------------------------+ | A00154876 | 260670 |福勒 |马丁 | 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 | +------------+--------------+--------+--------+--- ---------------------------------------------+

这些是我想要的结果:

+------------+--------------+--------+--------+--- -----------------------------------------+ |学生 ID |排序_PIDM |上一页 |第一 |测试 | +------------+--------------+--------+--------+--- -----------------------------------------+ | A00249466 | 260670 |福勒 |马丁 | A01B-22, A02B-19, A03B-21,A04B-23, A05B-21,| | | | | | DSPM-4、DSPR-4、DSPW-4 | +------------+--------------+--------+--------+--- -----------------------------------------+

【问题讨论】:

  • 很遗憾,我将离开几天。如果我不回复你,那就是为什么。谢谢!

标签: sql regex oracle listagg


【解决方案1】:

Oracle 设置

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

【讨论】:

  • @mto 谢谢。我能够得到我需要的结果。我什至不需要正则表达式!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2021-10-12
  • 2021-08-04
  • 2012-07-22
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多