2015-11-04 2 views
0

У меня есть таблица со следующей информацией:SQL Oracle - Найти все комбинации событий возможно на основе даты

Sample Data

**Table 1** 
palletNumber-- event-- --recordDate 
-----1-----------A-------01/11/2015 01:00 
-----1-----------B-------01/11/2015 02:00 
-----1-----------C-------01/11/2015 03:00 
-----1-----------D-------01/11/2015 04:00 
-----2-----------A-------01/11/2015 01:10 
-----2-----------C-------01/11/2015 01:15 
-----2-----------E-------01/11/2015 01:20 

Я хочу, чтобы выбрать все возможные комбинации событий, которые появляются в таблицу в последовательности recordDate по palletNumber. Я пробовал различные заявления с номером строки, над разделом, но это не приблизило меня к тому, что я ищу ... Любое направление, куда идти?

Это будет выходной таблицы, например:

**Table 2** 
event1-- event2-- 
---A------B------ 
---B------C------ 
---C------D------ 
---A------C------ 
---C------E------ 

Спасибо,

+0

Ьгу 'вести/лаг (событие) в течение (раздел по palletNumber приказа recordDate)' – Tatiana

ответ

2

Вы можете получить предыдущий или следующий случай с использованием lag() или lead():

select event, 
     lead(event) over (partition by palletnumber order by recorddate) as next_event 
from datasample; 

Если вы хотите исключить дубликаты, я был бы склонен использовать group by, потому что это также дает возможность подсчитать количество раз, которое каждый pai г появляется:

select event, next_event, count(*) as cnt 
from (select event, 
      lead(event) over (partition by palletnumber order by recorddate) as next_event 
     from datasample 
    ) ds 
group by event, next_event; 
+0

Спасибо большое, я не знал о свинца/лаг! Узнайте больше каждый день. – Aurax22

0

Use Case:

select case when palletNumber = 1 then event else null end as event1, 
     case when palletNumber = 2 then event else null end as event2, 
     recordDate 
    from table1 

Тогда вы можете работать с данными, используя привести/лаг или сумму()/группу по, чтобы получить его в один ряд.

Если предположить, что события 1/2 имеют только одну запись на дату

select recordDate, max (event1), max (event2) 
    from ( select case when palletNumber = 1 then event else null end as event1, 
        case when palletNumber = 2 then event else null end as event2, 
        recordDate 
       from table1 
      order by recordDate) tab2 
group by recordDate 
+0

Это сработало бы, если бы у меня было ограниченное количество palletNumber, но у меня сотни. Однако я использовал лидерство/отставание и группу! благодаря – Aurax22

Смежные вопросы