Обложка канала

Oracle Developer👨🏻‍💻

Все о разработке в СУБД "Oracle" SQL, PL/SQL, оптимизация, архитектура, сертификации и многое другое.

Oracle Developer👨🏻‍💻

4 года назад
Открыть в
Отчет для отдела маркетинга Постановка в посте вторника. Итоговый запрос
select c.id
      ,c.name
      ,max(a.city || ', ' || a.street || ', ' || a.house || ' fl. ' || a.flat)
           keep(dense_rank first order by a.a_type desc, nvl2(a.city, 1, 0) 
+ nvl2(a.street, 1, 0) + nvl2(a.house, 1, 0) + nvl2(a.flat, 1, 0) desc, a.created desc) address
      ,max(ph.c_info) keep(dense_rank first order by ph.created desc) phone
      ,max(em.c_info) keep(dense_rank first order by em.created asc) email
   from client c
     left join address a on a.client_id = c.id and a.active = 'Y'
     left join contact ph on ph.client_id = c.id and ph.c_type = 1 and ph.active = 'Y'
     left join contact em on em.client_id = c.id and em.c_type = 2 and em.active = 'Y'   
 group by c.id, c.name;

Пояснения Решение основано на аналитических функциях. 1️⃣ Основная сущность клиент. Соединяем с ним все дочерние. 2️⃣ В условиях соединения указываем “Y” - активность. 3️⃣ Таблицу contact соединяем дважды с разными типами контактов “1” и “2”. 4️⃣ Группируем по клиенту - фактически c.id, c.name это группировка до одного уникального клиента, просто для вывода имени. 5️⃣ Для получения требуемых данных применяем аналитическую функцию keep dense rank в режиме агрегации (group by указан). 6️⃣ Для получения адреса: - группировка по клиенту у нас уже есть, т.е. мы работаем уже внутри партиции “одного клиента”. - сортируем строки внутри партиции по типу (a.a_type desc), по заполненности из перечня атрибутов (сумма nvl2) и дате создания (a.created desc). - берем первую запись first из отсортированной партиции. max(a.city ', ' a.street ', ' a.house ' fl. ' a.flat) - говорит просто отдай MAX запись из отобранных (а это у нас только одна). Фактически она ни на что не влияет. 7️⃣ Для получения телефона применяется аналогичная конструкция как и для адреса с более простой сортировкой. 8️⃣ Для получения email применяется аналогичная конструкция как и для адреса с более простой сортировкой. Если не хотите ломать глаза ➡️ в более читаемом виде. Спасибо, всем кто публиковал свои решения в нашем чатике 👍 #решениезадачи #аналитическиефункции