代码之家  ›  专栏  ›  技术社区  ›  user8834780

没有分组依据的listag函数

  •  0
  • user8834780  · 技术社区  · 6 年前

    我有很多专栏 select

    我正在尝试使用 listagg() 在里面 声明,但不必 group by 选择 listagg() within group() over (partition by id) .

    select id, listagg(distinct annual_bill_rate, ', ') within group (order by bill_rate) as annual_bill_rate, email, state
    from table
    group by 1,3,4
    

    似乎不可能通过基于文档的方式来避免这一组,但是否有其他选择?我有30多列,我不能全部分组。谢谢您!

    id   bill_rate   email        state 
    1    0.0035      a@gmail.com  NJ
    1    0.0045      a@gmail.com  NJ
    1    0.0055      a@gmail.com  NJ
    2    0.0065      b@gmail.com  NY
    2    0.0075      b@gmail.com  NY
    3    0.0085      c@gmail.com  PA
    

    期望结果-无分组依据:

    id   bill_rate                email        state 
    1    0.0035, 0.0045, 0.0055   a@gmail.com  NJ
    2    0.0065, 0.0075           b@gmail.com  NY
    3    0.0085                   c@gmail.com  PA
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   JNevill    6 年前

    这里有一个不太好的方法来避免按组输入。它几乎肯定会变慢,而且更难阅读和理解。如果我在生产代码中遇到这个问题,我会很不高兴的:

    WITH table_distinct AS 
    (
        SELECT DISTINCT id, email, state
        FROM table
    )
    ,table_group_by AS
    (
        SELECT id, listagg(distinct annual_bill_rate, ', ') within group (order by bill_rate) as annual_bill_rate
        FROM table
        GROUP BY id
    )
    SELECT 
        td.*,
        tgb.annual_bill_rate        
    FROM table_distinct td
        INNER JOIN table_group_by tgb
            ON td.id = tgb.id;
    

    现在你真的只需要猴子就行了 table_distinct CTE向结果集中添加更多列。