Функция Листагга без группы по - PullRequest
0 голосов
/ 31 августа 2018

У меня есть много столбцов в операторе select, многие из которых являются производными вычислениями.

Я пытаюсь сгруппировать несколько строк в одну, используя listagg() в операторе select, но без необходимости group by остальных столбцов в операторе select. По линии 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 Ответ

0 голосов
/ 31 августа 2018

Вот не очень хорошая идея, чтобы не вводить GROUP BY. Это почти наверняка будет медленнее, и его намного сложнее читать и понимать. Я был бы несчастным парнем, если бы наткнулся на это в рабочем коде:

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, чтобы добавить больше столбцов в ваш набор результатов.

...