Хобрук: Ваш путь к мастерству в программировании

Oracle получает последнее значение на основе родительского/дочернего раздела

У меня есть таблица с именем клиента, которая выглядит так:

ID      ALPHA      BRAVO    CHARLIE          DATE
-------------------------------------------------
 1        111        222        333    02/02/2019
 2        333        444        555    11/11/2019
 3        666        555        777    12/12/2019
 4        777        888        999    05/05/2020
 5        100        101        110    12/25/2020

и мне нужно получить следующий вывод:

ID      ALPHA      BRAVO    CHARLIE          DATE     NEW_COL   ROW_NUM
-----------------------------------------------------------------------
 1        111        222        333    02/02/2019        333          4
 2        333        444        555    11/11/2019        333          3
 3        666        555        777    12/12/2019        333          2   
 4        777        888        999    05/05/2020        333          1
 5        100        101        110    12/25/2020        010          1

Столбцы ALPHA, BRAVO и CHARLIE представляют идентификаторы клиентов. У данного клиента может быть несколько идентификаторов в системе. Записи 1-4 представляют идентификаторы, принадлежащие одному и тому же клиенту, скажем, Джону. Согласно таблице, у Джона 12 идентификаторов, и его последний идентификатор — 999. Запись 5 представляет другого клиента, скажем, Джейн. У Джейн три идентификатора, и ее последний идентификатор — 110.

Целью столбца ROW_NUM является получение последнего значения CUSTOMER.CHARLIE. Идея состоит в том, чтобы использовать первое значение CHARLIE в качестве раздела. По сути, цель состоит в том, чтобы получить отображение один родитель: много дочерних элементов. В этом случае ID 333 нужно привязать к 555, 777 и 999.

Вот DDL/DML:

CREATE TABLE CUSTOMER
(ID NUMBER(20) NOT NULL,
 ALPHA NUMBER(20) NOT NULL,
 BRAVO NUMBER(20) NOT NULL,
 CHARLIE NUMBER(20) NOT NULL,
 CREATEDDATE DATE
 );
 
INSERT INTO CUSTOMER
VALUES
(1, 111, 222, 333, to_date('02-FEB-19','DD-MON-RR'));

INSERT INTO CUSTOMER
VALUES
(2, 333, 444, 555, to_date('11-NOV-19','DD-MON-RR'));

INSERT INTO CUSTOMER
VALUES
(3, 666, 555, 777, to_date('12-DEC-19','DD-MON-RR'));

INSERT INTO CUSTOMER
VALUES
(4, 777, 888, 999, to_date('05-MAY-20','DD-MON-RR'));

INSERT INTO CUSTOMER
VALUES
(5, 100, 101, 110, to_date('25-DEC-20','DD-MON-RR'));


COMMIT;

Я пробовал следующий запрос, но он не может правильно заполнить столбец раздела:

WITH
   charlies
   AS
      (SELECT DISTINCT charlie
       FROM customer),
   mult_customers
   AS
      (SELECT c.*, c.charlie AS NEW_COL
       FROM customer c
       UNION
       SELECT c.*,
              CASE WHEN c.alpha = e.charlie THEN c.alpha ELSE c.bravo END AS NEW_COL
       FROM customer c
            JOIN charlies e ON e.charlie = c.alpha OR e.charlie = c.bravo),
   ranked
   AS
      (SELECT mc.*,
              ROW_NUMBER ()
                 OVER (PARTITION BY NEW_COL ORDER BY createddate DESC) AS row_num
       FROM mult_customers mc)
SELECT *
FROM ranked
ORDER BY ID;

Спасибо за любую оказанную помощь.

25.07.2020

  • Сколько строк в вашей реальной таблице? Это задание для производственного использования или просто домашнее задание для студентов? 26.07.2020
  • эта задача предназначена для производственного использования; реальная таблица содержит около 8000 записей прямо сейчас, но со временем количество записей будет продолжать расти. В течение следующего года он может иметь 100 000 записей. 26.07.2020

Ответы:


1

Ваша задача называется связанными компонентами. Лет 7-8 назад я написал решение для этого и даже пакета pl/sql: http://orasql.org/2017/09/29/connected-components/

Это решение на PL/SQL намного эффективнее, чем решения на чистом SQL: http://orasql.org/2014/02/28/straight-sql-vs-sql-and-plsql/

Дайте мне знать, если вам нужна помощь в адаптации его для вашей задачи.

26.07.2020
  • Спасибо, что поделились Саяном! Ваше решение пригодилось. 27.07.2020
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..