【问题标题】:How to remove duplicate values from a aggregate list when using LISTAGG() in oracle SQL? [duplicate]在 oracle SQL 中使用 LISTAGG() 时如何从聚合列表中删除重复值? [复制]
【发布时间】:2018-06-20 21:15:41
【问题描述】:

我已经创建了一个表:

Grade FName LName-

A     JOHN     M

A     JOE      M

A     JOAKIM   M

使用 Listagg() 通过查询获得 Fname 和 Lname 的串联聚合:

SELECT GRADE,listagg(st_name || ';' || st_last_name, ';')
        within group ( order by st_name) as names FROM STUDENTS GROUP BY GRADE;

我得到的输出是:

GRADE    Name

A     JOAKIM;M;JOE;M;JOHN;M

B        BROAD;M

C        KEVIN;M;SEEHO;M

我想在名称列中保留唯一的“M”,并想丢弃其他 M。请向我提供有关如何完成此操作的任何建议。请不要针对此问题。谢谢!

示例: KEVIN;M;SEEHO;M 应该是 KEVIN;M;SEEHO, JOAKIM;M;JOE;M;JOHN;M 应该是 JOAKIM;M;JOE;JOHN 等等...

【问题讨论】:

    标签: sql oracle listagg


    【解决方案1】:

    对于简单查询,您可以使用子查询:

    SELECT GRADE, listagg(name, ';') within group (order by name) as names
    FROM (SELECT DISTINCT GRADE, st_name || ';' || st_last_name as name
          FROM STUDENTS
         ) s
    GROUP BY GRADE;
    

    我觉得奇怪的是,您使用分号来分隔 st_namest_last_name 并分隔不同的值。我希望使用不同的分隔符——'john;smith;jane;doe;''john,smith;jane,doe' 更难阅读。

    【讨论】:

    • 我有一个要求,需要 M 是一次,并且该列表被设置在 DTO 对象中。我们可以在没有子查询的情况下做到这一点吗?
    • 如何编辑问题(问题标签下方有一个edit 按钮)并包含一些测试数据?谢谢。
    • 我已经添加了数据。你现在能帮忙吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2021-11-08
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多