Oracle SQL - извлечение нескольких строк из комбинации столбцов одной строки - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть данные такого типа в БД Oracle SQL:

personId  lastEvent currentEvent nextEvent
1         null      1            2
1         1         2            3
1         2         3            4
1         3         4            null

Для одной строки, например

personId  lastEvent currentEvent nextEvent
1         null      1            2

Я хочу извлечь две строки, извлеченные путем объединениястолбцы событий и классифицируют эти две строки для конкретного currentEvent.Например:

Строка № 1

personId  lastEvent currentEvent nextEvent
1         null      1            2

Результат № 1

personId  event1 event2 currentEvent
1         null   1      1
1         1      2      1  

Строка № 2

personId  lastEvent currentEvent nextEvent
1         1         2            3

Результат № 2

personId  event1 event2 currentEvent
1         1      2      2
1         2      3      2

и т. Д. ..... Мне известно о существовании предложения CONNECT BY , но я не могу выяснить запрос для получения этих результатов.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это вообще не иерархический запрос: вы просто хотите разделить каждую входную строку на две выходные строки и применить небольшую логику.

Простой способ выполнить разбиение - CROSS JOIN ваша таблицак источнику строк, который имеет ровно две строки.

Например,

with input_data ( personId,  lastEvent, currentEvent, nextEvent) AS
(
SELECT 1, null, 1, 2     FROM DUAL UNION ALL
SELECT 1, 1,    2, 3     FROM DUAL UNION ALL
SELECT 1, 2,    3, 4     FROM DUAL UNION ALL
SELECT 1, 3,    4, null  FROM DUAL )
SELECT personId,
       decode(rn, 1, lastEvent, 2, currentEvent) event1,
       decode(rn, 1, currentEvent, 2, nextEvent) event2,
       currentEvent
from input_data 
CROSS JOIN ( SELECT rownum rn FROM DUAL CONNECT BY ROWNUM <= 2 ) r
ORDER BY personId, currentEvent, rn;
+----------+--------+--------+--------------+
| PERSONID | EVENT1 | EVENT2 | CURRENTEVENT |
+----------+--------+--------+--------------+
|        1 |        |      1 |            1 |
|        1 |      1 |      2 |            1 |
|        1 |      1 |      2 |            2 |
|        1 |      2 |      3 |            2 |
|        1 |      2 |      3 |            3 |
|        1 |      3 |      4 |            3 |
|        1 |      3 |      4 |            4 |
|        1 |      4 |        |            4 |
+----------+--------+--------+--------------+
0 голосов
/ 12 февраля 2019

Вот один из способов сделать это.

Хотя для этого я не использовал иерархический запрос.

create table t(personId int,lastEvent int, currentEvent int, nextEvent int);

insert into t values(1,null,1,2);
insert into t values(1,1,2,3);
insert into t values(1,2,3,4);
insert into t values(1,3,4,null);


    select a.personId,case when b.rn=1 then 
                            a.lastEvent 
                       else a.currentEvent
                   end as event1
       ,case when b.rn=1 then 
                  a.currentEvent 
             else a.nextEvent
         end as event2
       ,case when a.nextEvent is not null then 
                  a.currentEvent
        end as currentEvent       
  from t a
  join (select rownum as rn from all_objects where rownum<=2) b
    on case when a.nextEvent is not null then 2
            else 1
        end >=b.rn
order by 1,4,3   


+----------+--------+--------+--------------+
| PERSONID | EVENT1 | EVENT2 | CURRENTEVENT |
+----------+--------+--------+--------------+
|        1 |     -  |      1 |            1 |
|        1 |      1 |      2 |            1 |
|        1 |      1 |      2 |            2 |
|        1 |      2 |      3 |            2 |
|        1 |      2 |      3 |            3 |
|        1 |      3 |      4 |            3 |
|        1 |      3 |      4 |           -  |
+----------+--------+--------+--------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...