Oracle: сортировать результаты по дате с подгруппой по той же дате

Мне нужно отсортировать мои общие результаты по столбцу даты создания, указанному ниже, но сгруппировать их по идентификатору приложения, а эти подгруппы отсортировать по той же дате, например так:

APPLICATION_ID  STATUS  CREATE_DATE
12345           REC     01-06-2017
12345           PRO     02-06-2017
12345           DEL     03-06-2017
12746           REC     02-06-2017
12746           REC     05-06-2017
12743           DEL     04-06-2017
12743           PRO     09-06-2017
12743           PRO     11-06-2017

APPLICATION_ID - это тип данных VARCHAR2, а CREATE_DATE - тип DATE. Ни один столбец не обнуляется.

У меня нет доступа к другим соответствующим таблицам в схеме, я могу только запросить эту. Сортировка по приведенному ниже запросу не дает общего порядка дат, который мне нужен.

SELECT * FROM MY_TABLE ORDER BY APPLICATION_ID, CREATE_DATE;

Пример вывода:

APPLICATION_ID  STATUS  CREATE_DATE
10603           REC     15-06-2017
10603           PRO     15-06-2017
10603           DEL     22-06-2017
11251           REC     21-06-2017
11251           REC     21-06-2017
11894           DEL     02-06-2017
11894           PRO     05-06-2017
11894           PRO     06-06-2017

В приведенном выше примере я пытаюсь получить сначала 11894 записи, затем 10603, затем 11251.

1 ответ

Решение

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

with MY_TABLE as (
  select 12746 APPLICATION_ID, 'REC' STATUS, date '2017-06-02' CREATE_DATE from dual union all
  select 12746 APPLICATION_ID, 'REC' STATUS, date '2017-06-05' CREATE_DATE from dual union all
  select 12743 APPLICATION_ID, 'DEL' STATUS, date '2017-06-04' CREATE_DATE from dual union all
  select 12743 APPLICATION_ID, 'PRO' STATUS, date '2017-06-09' CREATE_DATE from dual union all
  select 12743 APPLICATION_ID, 'PRO' STATUS, date '2017-06-11' CREATE_DATE from dual union all
  select 12345 APPLICATION_ID, 'REC' STATUS, date '2017-06-01' CREATE_DATE from dual union all
  select 12345 APPLICATION_ID, 'PRO' STATUS, date '2017-06-02' CREATE_DATE from dual union all
  select 12345 APPLICATION_ID, 'DEL' STATUS, date '2017-06-03' CREATE_DATE from dual
)
select *
from   MY_TABLE 
order by min(create_date) over(partition by APPLICATION_ID), APPLICATION_ID, CREATE_DATE

Это создает вывод, который вы перечислили.

Другие вопросы по тегам