Данные дублируются при использовании Listagg - PullRequest
0 голосов
/ 01 января 2019

Я много часов пытался решить эту проблему, мои данные (ONHAND NUM, PO) продолжают показывать повторяющиеся данные, см. Мой код, как показано ниже.Кстати, если я удалю следующий код, то мои ONHAND NUM & PO больше не будут дублироваться, поэтому я считаю, что в этом коде что-то не так.Пожалуйста помогите.Спасибо.

    select
listagg(OH.ONHAND_REF,', ')within group(order by ES.SHPMNT_REF) as "Onhand Num",
listagg(PO.PO_ALL_TRACES,', ')within group(order by PO.PO_ALL_TRACES) as "PO"
from BRDB.EXPORT_SHIPMENT ES 
left outer join EXPORT_ONHAND OH on ES.SHPMNT_REF = OH.SHPMNT_REF
left outer join VW_EXPORT_TRACE_PO PO on PO.FILE_NO = OH.ONHAND_REF
left outer join EXPORT_SHPMNT_CTNR CTNR on CTNR.SHPMNT_REF = ES.SHPMNT_REF
group by ES.SHPMNT_REF

Если я удалю следующий код, мои данные будут выглядеть нормально без дублирования

  left outer join BRDB.EXPORT_SHPMNT_CTNR CTNR on CTNR.SHPMNT_REF = ES.SHPMNT_REF

Результат, который я получил, как показано ниже

Onhand Num          PO
555,555,555         P0001,P0001,P0001
666,777,666,777     P0002,P0003,P0002,P0003

результат я хочу

Onhand Num      PO
 555            P0001
 666,777        P0002,P0003

1 Ответ

0 голосов
/ 01 января 2019

К сожалению, listagg() не поддерживает параметр distinct.Вы можете обойти это, используя оконные функции или предварительно агрегируя по каждому измерению.Последний метод более эффективен, но без выборочных данных я не решаюсь предложить конкретный запрос.

Итак, достаточно простой метод - использовать row_number() и тот факт, что listagg() игнорирует NULLзначения:

select x.SHPMNT_REF,
       listagg(case when seqnum_ohr = 1 then x.ONHAND_REF end, ', '
              ) within group (order by x.SHPMNT_REF) as onhand_numbers,
       listagg(case when seqnum_pat = 1 then x.PO_ALL_TRACES end, ', '
              ) within group (order by x.PO_ALL_TRACES) as pos
from (select ES.SHPMNT_REF, PO.PO_ALL_TRACES, OH.ONHAND_REF,
             row_number() over (partition by ES.SHPMNT_REF, PO.PO_ALL_TRACES order by ES.SHPMNT_REF) as seqnum_pat,
             row_number() over (partition by ES.SHPMNT_REF, OH.ONHAND_REF order by ES.SHPMNT_REF) as seqnum_ohr
      from BRDB.EXPORT_SHIPMENT ES left outer join 
           EXPORT_ONHAND OH
           on ES.SHPMNT_REF = OH.SHPMNT_REF left outer join
           VW_EXPORT_TRACE_PO PO
           on PO.FILE_NO = OH.ONHAND_REF left outer join
           EXPORT_SHPMNT_CTNR CTNR
           on CTNR.SHPMNT_REF = ES.SHPMNT_REF
     ) x
group by x.SHPMNT_REF;

Обратите внимание, что я также включаю SHPMNT_REF в SELECT.Это похоже на хорошую практику при агрегировании по этому столбцу.Конечно, вам не нужно его включать.

Я также изменил псевдонимы столбцов, чтобы им не требовались escape-символы (двойные кавычки).Отсутствие идентификаторов только усложняет написание и чтение запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...