2016-03-17 2 views
0
create table discharge 
(
id number 
discharge date 
); 

Table created. 

insert into discharge values(1606905792457620, '06-DEC-15') 
insert into discharge values(1606905792457620, '20-DEC-15') 
insert into discharge values(1606905792457620, '06-JAN-16') 
commit; 

create table visit 
(
id number 
visit date 
); 

Table created. 

insert into visit values(1606905792457620, '08-DEC-15') 
insert into visit values(1606905792457620, '19-DEC-15') 
insert into visit values(1606905792457620, '30-DEC-15') 
insert into visit values(1606905792457620, '11-JAN-16') 
insert into visit values(1606905792457620, '17-FEB-16') 
commit; 

Требование состоит в том, чтобы каждый уникальный сброс требовал двух уникальных посещений. Каждое посещение может применяться только к одному выходу. Так что, хотя два раза больше, чем разгон 06-JAN-16, только один не был применен к предыдущему разряду. Я пытался ранг и row_number, но я не могу понять, как «окно» дата посещения, которые 1. больше даты выписки и 2. не было применены к другим разрядамsql окно динамического пула дат

Вот как мне это нумеруется:

id      discharge   visit 
1606905792457620  1 06-DEC-15 1 08-DEC-15 
1606905792457620  1 06-DEC-15 2 19-DEC-15 
1606905792457620  2 20-DEC-15 1 30-DEC-15 
1606905792457620  2 20-DEC-15 2 11-JAN-16 
1606905792457620  3 06-JAN-16 1 17-FEB-16 

Заранее благодарим за любые ответы.

+0

Это было бы намного проще, если бы таблица посещений показала, к какому разряду она была связана. Невозможно ли получить эту информацию в эту таблицу? Предположительно, эта информация известна в момент добавления визита? – Boneist

+0

Я полностью согласен; к сожалению (для меня), посещения захватываются отдельно от разрядов. Я начинаю думать, что это единственный способ добиться этого. Спасибо за ваш ответ – adamus

ответ

0

Ближайший я могу добраться до, не вдаваясь в сложные царства пункта MODEL является:

select id, 
     discharge, 
     visit, 
     row_number() over (partition by id, discharge order by visit) rn2 
from (select d.*, 
       v.visit, 
       row_number() over (partition by v.id, v.visit order by d.discharge desc) rn1 
     from visit v 
       inner join discharge d on (v.id = d.id and v.visit >= d.discharge)) 
where rn1 = 1 
order by 2, 3; 

       ID DISCHARGE VISIT    RN2 
----------------- ---------- ---------- ---------- 
1606905792457620 06/12/2015 08/12/2015   1 
1606905792457620 06/12/2015 19/12/2015   2 
1606905792457620 20/12/2015 30/12/2015   1 
1606905792457620 06/01/2016 11/01/2016   1 
1606905792457620 06/01/2016 17/02/2016   2 

Можно утверждать, что если визит происходит после того, как два разряда дату, что он принадлежит к последнему разряда, а чем раньше?

+0

Конечно, есть несколько, где это произошло. Я иду на предположение об обратном. Даты посещения относятся к «нераспределенным» срокам выписки. – adamus

+0

Это проблема с тем, чтобы не хранить, с которой связан визит. У вас могут быть ситуации, когда более раннее посещение пропущено, или это может быть просто отложено. Или у вас может быть 3 посещения для одного и того же разряда; как вы хотели знать, что это такое? Я очень рекомендую, чтобы дизайн был изменен! – Boneist

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