仅查找 listagg 中的重复值

find only the duplicate values in listagg

我的 table 中有一些重复的行。我想找到那些重复项。

在列 rp_num 上完成 listagg 之后,我的 table 将具有这样的重复值:

 SELECT distinct vt.vsd_id, vt.rn,vt.rp_id,
 LISTAGG(vt.rp_num,' ') WITHIN GROUP (ORDER BY Nlssort(vt.rp_num, 'NLS_SORT=BINARY_CI')) 
                  over (PARTITION BY vt.vsd_id, vt.rn,vt.rp_id ) vp_num_gruppe 
             FROM   vechicle_datatype vt
            where vt.vsd_id = 37897;

我只想 select rp_num_group 中的那些重复值(在 rp_num 列的 listagg 之后)。 我尝试对 listagg 使用 count(*) 但它不起作用。

我只想select下面提到的那些值:

您可以使用 listagg() 的聚合形式,并使用 having 子句进行过滤:

SELECT 
    vsd_id, 
    rn,
    rp_id,
    LISTAGG(rp_num,' ') WITHIN GROUP (ORDER BY Nlssort(rp_num, 'NLS_SORT=BINARY_CI')) vp_num_gruppe 
FROM  vechicle_datatype vt
WHERE vt.vsd_id = 37897
GROUP BY vsd_id, rn, rp_id
HAVING COUNT(*) > 1

您可以使用如下解析函数:

SELECT * FROM 
(SELECT T.*, 
        COUNT(1) OVER (PARTITION BY VT.VSD_ID, VT.RN, VP_NUM_GRUPPE) AS CNT
   FROM (SELECT VT.VSD_ID, VT.RN, VT.RP_ID,
                LISTAGG(VT.RP_NUM,' ') WITHIN GROUP(
                   ORDER BY NLSSORT(VT.RP_NUM,'NLS_SORT=BINARY_CI')) AS VP_NUM_GRUPPE
           FROM VECHICLE_DATATYPE VT
          WHERE VT.VSD_ID = 37897
       GROUP BY VT.VSD_ID, VT.RN, VT.RP_ID)T )
 WHERE CNT > 1;