【问题标题】:Find duplicates in CONCAT DB2在 CONCAT DB2 中查找重复项
【发布时间】:2021-04-19 13:17:03
【问题描述】:
TempTable(Ncol1, Ncol2) as 
(SELECT
   col1,
    SUBSTR(xmlserialize(xmlagg(xmltext(CONCAT( ', ', col2))) as VARCHAR(1024)), 3) AS ConcatCol2
    FROM Table A
    WHERE A.col2 IN ('A','B','C','D')
    and A.Date >= (select FirstDayMonth from dates)
    GROUP BY A.col1)

在表 A 中,列 col2 的值如下:

A
B
C
D

我有上面的代码concat 像这样ABCD 但它只重复了一个像这样ABCDD 的值。 我在子查询中尝试了 DISTINCT,就像我在这里阅读的另一个主题一样,但是其他解决方案是什么?

谢谢!

【问题讨论】:

  • 你的 db2 版本和平台是什么?

标签: sql database db2


【解决方案1】:

使用LISTAGG(DISTINCT 时,ORDER BY 需要与 LISTAGG 子句相同

所以这行得通

SELECT 
    col1
,   LISTAGG(DISTINCT CONCAT( ', ', col2)) WITHIN GROUP 
           (ORDER BY CONCAT( ', ', col2))
FROM TableA
WHERE
    col2 IN ('A','B','C','D')
GROUP BY
    col1

但是这个

SELECT 
    col1
,   LISTAGG(DISTINCT CONCAT( ', ', col2)) WITHIN GROUP 
           (ORDER BY               col2 )
FROM TableA
WHERE
    col2 IN ('A','B','C','D')
GROUP BY
    col1

得到

ORDER BY 子句中以下位置的表达式,或“ORDER BY”子句中以“CONCAT...”开头的表达式无效。原因代码 = "2".. SQLCODE=-214, SQLSTATE=42822

正如预期的那样,LISTAGG 的手册页中对此进行了说明

如果为 LISTAGG 指定了 DISTINCT,则 ORDER BY 规范的排序键必须匹配字符串表达式 (SQLSTATE 42822)。如果 string-expression 被隐式转换,则排序键必须显式包含相应的匹配转换规范。

【讨论】:

    【解决方案2】:

    试试LISTAGG(DISTINCT )

    CREATE TABLE T(C VARCHAR(32))
    
    INSERT INTO T VALUES ('A'),('B'),('B'),('C')
    
    SELECT LISTAGG(DISTINCT C) WITHIN GROUP ( ORDER BY C) FROM T 
    

    会回来

        1     
    ------
    ABC   
    

    对于LISTAGG 中的DISTINCT 选项,您需要使用 DB2 11.1 或更高版本

    【讨论】:

    • 嘿,这不行,我不知道我的版本是什么,这是我的代码: TempTable(Ncol1, Ncol2) as (SELECT col1, LISTAGG(DISTINCT (CONCAT( ', ', col2))) WITHIN GROUP ( ORDER BY col2) FROM Table A WHERE A.col2 IN ('A','B','C','D') and A.Date >= (select FirstDayMonth from dates)按 A.col1) 分组
    • 您可以使用此查询找到您的服务器的 DB2 版本。从 SYSIBMADM.ENV_INST_INFO 中选择 SERVICE_LEVEL
    猜你喜欢
    • 2013-02-21
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多