listagg с DISTINCT в красном смещении

Я изо всех сил пытаюсь найти хороший способ сделать DISTINCT в listagg в красном смещении.

Все, что я хочу сделать, это перечислить комбинацию продуктов, но каждая строка должна возвращать список отдельных продуктов.

Пример

Желаемый результат:

bulb, light
bulb, light, fan

вместо:

bulb, bulb, light
bulb, bulb, light, fan

Ниже мой SQL:

select
    tit.listagg  
from (
    SELECT
        username,
        listagg(node_name, ',')
        WITHIN GROUP (ORDER BY node_name asc)
    FROM table
    Where node_type not like '%bla bla%'
    GROUP BY username
) as tit
group by listagg;

person luck_dataWay    schedule 07.07.2017    source источник
comment
Теперь вы можете использовать DISTINCT в listagg в качестве необязательного предложения. Подробнее здесь: docs.aws.amazon.com/redshift/latest/ dg/r_LISTAGG.html   -  person Black Milk    schedule 12.01.2018


Ответы (2)


Вы можете перечислить строки, а затем выбрать первую:

select username,
       listagg(case when seqnum = 1 then node_name end, ',') within group (order by node_name asc) 
from (select t.*,
             row_number() over (partition by username, node_name order by node_name) as seqnum
      from table t
      where node_type not like '%bla bla%' 
     ) t
group by username;

При этом используется функция, при которой listagg() игнорирует значения NULL.

person Gordon Linoff    schedule 07.07.2017
comment
действительно замечательный ответ и быстрый. Получил это работает. :) - person luck_dataWay; 07.07.2017

Redshift теперь поддерживает LISTAGG DISTINCT, поэтому нет необходимости в подзапросе: https://aws.amazon.com/about-aws/whats-new/2017/10/amazon-redshift-announces-support-for-listagg-distinct/< /а>

person alok    schedule 13.06.2019