Oracle SQL: как сгруппировать одно и то же значение в другую группу - PullRequest
0 голосов
/ 25 марта 2020

База данных: Oracle База данных 12 c Релиз 12.2.0.1.0

Ниже приводится сценарий моего теста:

create table test
(
id number(1),
sdate date,
tdate date,
prnt_id number(1)
);

insert into test (id, sdate, tdate, prnt_id) values (1, to_date('10/17/2012','mm/dd/yyyy'), to_date('10/16/2014','mm/dd/yyyy'), 2);
insert into test (id, sdate, tdate, prnt_id) values (1, to_date('10/16/2014','mm/dd/yyyy'), to_date('2/16/2016','mm/dd/yyyy'), 2);
insert into test (id, sdate, tdate, prnt_id) values (1, to_date('2/16/2016','mm/dd/yyyy'), to_date('9/30/2016','mm/dd/yyyy'), 3);
insert into test (id, sdate, tdate, prnt_id) values (1, to_date('9/30/2016','mm/dd/yyyy'), to_date('3/16/2017','mm/dd/yyyy'), 3);
insert into test (id, sdate, tdate, prnt_id) values (1, to_date('3/16/2017','mm/dd/yyyy'), to_date('1/16/2019','mm/dd/yyyy'), 2);
insert into test (id, sdate, tdate, prnt_id) values (1, to_date('1/16/2019','mm/dd/yyyy'), to_date('10/16/2019','mm/dd/yyyy'), 2);
insert into test (id, sdate, tdate, prnt_id) values (1, to_date('10/16/2019','mm/dd/yyyy'), to_date('12/1/2999','mm/dd/yyyy'), 2);

commit;

select * from test order by sdate;

Вопрос:

I хотите изменить вышеуказанное Выберите SQL, который возвращает все 7 строк из тестовой таблицы, выбирает все столбцы плюс еще два столбца. Первый дополнительный столбец (min_sdate) вернется 17.10.2012 для строк 1,2 и 16.02.2016 для строк 3,4 и 16.03.2017 для строк 5,6,7. Второй дополнительный столбец (max_tdate) вернет 16.02.2016 для строк 1,2 и 16.03.2017 для строк 3,4 и 01.12.2999 для строк 5,6,7. По сути, я пытаюсь сгруппировать по столбцу prnt_id, но вместо двух групп (prnt_id: 2 и 3) я хочу три группы (prnt_id: 2,3,2), а затем для этих трех групп получим min (sdate) и макс (дата). Я думал, что мог бы использовать аналитическую функцию min () и max () с предложением window для достижения этой цели, но не знал, как создать рамку SQL.

. Любая или вся помощь будет оценена. Спасибо!

1 Ответ

2 голосов
/ 25 марта 2020

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

select t.*,
       min(sdate) over (partition by id, prnt_id, seqnum - seqnum_2),
       max(edate) over (partition by id, prnt_id, seqnum - seqnum_2)
from (select t.*,
             row_number() over (partition by id order by sdate) as seqnum,
             row_number() over (partition by id, prnt_id order by sdate) as seqnum_2
      from test t
     ) t;

Почему это работает немного сложно объяснить. Но если вы посмотрите на результаты подзапроса, вы сможете увидеть, как разница в номерах строк определяет группы, которые вы хотите определить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...