Изменить значения LISTAGG из одной таблицы на основе набора данных из другой таблицы

Мне нужно отправить данные пользователям, которые подписываются на события. Эти события происходят, когда состояние удаляется или добавляется в список состояний, связанных с группой.

Некоторый контекст: у моих данных есть группы, и у каждой группы есть список состояний, которые называются состояниями подчиненных лидов. Группы могут иметь столько состояний сублидов, сколько им нужно.

Таким образом, у группы 1 могут быть IA, WY и NY в качестве сублидов, или она может иметь только IA, или может не иметь ни одного.

Мой вопрос касается 3 разных таблиц.

  • Таблица под названием group_sublead_state, в которой содержатся записи для каждого состояния сублида, принадлежащего группе
  • Таблица аудита под названием sublead_state_audit, которая содержит информацию о том, когда сублид добавляется или удаляется из группы.
  • Таблица под названием sublead_change_results, которая появится в электронной почте пользователя, когда состояние, на которое они подписаны, будет удалено или добавлено в список состояний сублидов группы (эта таблица должна быть результатом моего запроса. Я не могу создать эту таблицу, сделайте вставки , удаляет или обновляет. Это строго результаты большого длинного уродливого запроса на выборку, который объединяет две другие таблицы вместе с парой таблиц, которые содержат другую информацию, такую ​​​​как имена групп и т. Д. (Другие таблицы не имеют значения))

Вот таблицы с некоторыми данными:

group_sublead_state

group_id    state
1           IA
1           WY
2           NY
2           OH
2           NV

Эта таблица говорит нам о том, что есть две группы, одна с двумя состояниями сублидов, другая с тремя состояниями сублидов.

Вот таблица sublead_state_audit

group_id    state_added    state_removed
1           none           MO
1           IA             none
2           NY             none
2           OH             none
2           none           CA

Мы видим из таблицы аудита, что самые последние изменения заключаются в том, что

  • group_id 1 удалил MO и добавил IA
  • В group_id 2 добавлены NY и OH, а CA удален

Таким образом, таблица sublead_change_results должна выглядеть следующим образом.

group_id    old_states    new_states
1           MO,WY         IA,WY
2           CA,NV         NY,OH,NV

Таким образом, столбец new_states довольно прост, и я уже завершил его, используя функцию LISTAGG (мы будем называть этот список для каждой группы current_state_list). Однако столбец old_states... здесь мне нужна помощь.

Я должен использовать ресурсы из этих таблиц для компиляции списка, разделенного запятыми, в столбце old_states. До сих пор я думал о том, чтобы попытаться использовать логику, уже созданную для столбца new_states. Итак, для каждого group_id я буду удалять состояния из current_states_list, которые находятся в столбце state_added таблицы sublead_state_audit; и я добавлю состояния к current_states_list, которые находятся в столбце state_removed файла sublead_state_audit.

Это вообще возможно с LISTAGG? Есть ли другой способ сделать это? Любая помощь будет принята с благодарностью.


person Simoney    schedule 30.06.2015    source источник


Ответы (1)


Я думаю, что это делает то, что вы хотите:

select x.group_id,
       x.old_states,
       y.new_states
  from (select group_id,
               listagg(state, ',') within group(order by state) as old_states
          from (select group_id,
                       state_removed as state
                  from sublead_state_audit
                 where state_removed <> 'none'
                union all
                select group_id,
                       state
                  from group_sublead_state
                 where state not in (select state_added from sublead_state_audit))
         group by group_id) x
  join (select group_id,
               listagg(state, ',') within group(order by state) as new_states
          from group_sublead_state
         group by group_id) y
    on x.group_id = y.group_id;

Скрипт: http://sqlfiddle.com/#!4/2921e/1/0

person Brian DeMilia    schedule 30.06.2015
comment
Я верю, что вы решили мою проблему! Сейчас работаю над проверкой. Отмечу это как решение, как только закончу. - person Simoney; 01.07.2015