Как упорядочить и сгруппировать строки в запросе по главному идентификатору - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь написать запрос выбора в Oracle, в котором результаты «изолированы» по группам. У каждой группы есть родительский объект, у которого есть несколько дочерних элементов, поэтому я хочу сгруппировать строки таким образом, чтобы каждая группа начиналась с родительского объекта, за которым следуют соответствующие дочерние элементы.

Таблица имеет следующую структуру:

ID | CREATION_DATE       | MASTER_ID
33 | 2019-07-01 09:31:04 | null
52 | 2019-07-01 10:45:04 | null
64 | 2019-07-01 11:00:04 | 33
71 | 2019-07-01 11:01:04 | 52
72 | 2019-07-01 12:31:04 | 33

До сих пор я пробовал следующий код, который возвращает строки, не сгруппированные по MASTER_ID, но упорядоченные по CREATION_DATE:

SELECT ID, CREATION_DATE, MASTER_ID
FROM ENTITY
WHERE CREATION_DATE >= TO_DATE('06-01-2019','MM-DD-YYYY')
ORDER BY CREATION_DATE DESC

Я хочу найти способ вернуть следующую структуру:

ID | CREATION_DATE       | MASTER_ID
33 | 2019-07-01 09:31:04 | null
64 | 2019-07-01 11:00:04 | 33
72 | 2019-07-01 12:31:04 | 33
52 | 2019-07-01 10:45:04 | null
71 | 2019-07-01 11:01:04 | 52

Проблема в том, что родительская сущность постоянно null, поэтому я не могу использовать GROUP BY. У вас есть какой-нибудь совет, как мне работать над этим?

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

Я думаю, что это просто заказать с динамическим столбцом.

WITH your_table AS (SELECT 33 ID, to_date('2019-07-01 09:31:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, NULL master_id FROM dual UNION ALL
                    SELECT 52 ID, to_date('2019-07-01 10:45:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, NULL master_id FROM dual UNION ALL
                    SELECT 72 ID, to_date('2019-07-01 12:31:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, 33 master_id FROM dual UNION ALL
                    SELECT 64 ID, to_date('2019-07-01 11:00:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, 33 master_id FROM dual UNION ALL
                    SELECT 71 ID, to_date('2019-07-01 11:01:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, 52 master_id FROM dual)
SELECT
    ID,
    CREATION_DATE,
    MASTER_ID
FROM
    (
        SELECT
            ID,
            CREATION_DATE,
            MASTER_ID,
            CASE
                WHEN MASTER_ID IS NULL THEN 0
                ELSE 1
            END AS RN
        FROM
            YOUR_TABLE
        ORDER BY
            CASE
                WHEN MASTER_ID IS NULL THEN ID
                ELSE MASTER_ID
            END,
            RN
    );

db <> fiddle demo

Ура !!

0 голосов
/ 01 июля 2019

Если у вас только один уровень иерархии, то вы можете просто сделать:

select t.*
from t
order by coalesce(t.master_id, t.id),
         t.creation_date
0 голосов
/ 01 июля 2019

Вы можете сделать это, используя иерархический запрос connect by вместе с предложением order siblings by, например ::

WITH your_table AS (SELECT 33 ID, to_date('2019-07-01 09:31:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, NULL master_id FROM dual UNION ALL
                    SELECT 52 ID, to_date('2019-07-01 10:45:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, NULL master_id FROM dual UNION ALL
                    SELECT 72 ID, to_date('2019-07-01 12:31:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, 33 master_id FROM dual UNION ALL
                    SELECT 64 ID, to_date('2019-07-01 11:00:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, 33 master_id FROM dual UNION ALL
                    SELECT 71 ID, to_date('2019-07-01 11:01:04', 'yyyy-mm-dd hh24:mi:ss') creation_date, 52 master_id FROM dual)
SELECT ID,
       creation_date,
       master_id,
       connect_by_root(ID) top_id
FROM   your_table
START WITH master_id IS NULL
CONNECT BY PRIOR ID = master_id
ORDER SIBLINGS BY creation_date;

        ID CREATION_DATE  MASTER_ID     TOP_ID
---------- ------------- ---------- ----------
        33 01/07/2019 09                    33
        64 01/07/2019 11         33         33
        72 01/07/2019 12         33         33
        52 01/07/2019 10                    52
        71 01/07/2019 11         52         52
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...