【问题标题】:find only the duplicate values in listagg仅查找 listagg 中的重复值
【发布时间】:2020-10-20 13:15:16
【问题描述】:

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

在我对列 rp_num 完成 listagg 之后,我的表将有这样的重复值:

 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;

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

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

【问题讨论】:

    标签: sql oracle duplicates oracle12c listagg


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      您可以使用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
      

      【讨论】:

      • 嗨,谢谢,我试过了。我想要在 rp_num 列上的 listagg 之后出现的重复项。
      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      相关资源
      最近更新 更多