2016-04-11 3 views
0

Учитывая приведенные ниже данные, как выбрать только те записи, для которых:Oracle SQL - Как contrain связанные записи Timewise

а) по меньшей мере один предыдущий билет на тот же client_id существует и

б) максимальная разница во времени каждого запрашиваемого билета не может превышать 14 дней. Другими словами, если билет имеет преемника, как описано в а), и этот преемник был создан> 14 дней спустя, его не следует рассматривать.

create table tickets (
ticket_id number, 
client_id number, 
start_time date); 

insert into tickets values (1,1,to_date('201601011330','yyyymmddhh24mi')); 
insert into tickets values (2,1,to_date('201601021320','yyyymmddhh24mi')); 
insert into tickets values (3,1,to_date('201601101330','yyyymmddhh24mi')); 
insert into tickets values (4,1,to_date('201603101330','yyyymmddhh24mi')); 
insert into tickets values (5,2,to_date('201601011630','yyyymmddhh24mi')); 
insert into tickets values (6,2,to_date('201601201330','yyyymmddhh24mi')); 
insert into tickets values (7,3,to_date('201602011330','yyyymmddhh24mi')); 
insert into tickets values (8,4,to_date('201602290000','yyyymmddhh24mi')); 
insert into tickets values (9,4,to_date('201603011630','yyyymmddhh24mi')); 
insert into tickets values (10,4,to_date('201604011120','yyyymmddhh24mi')); 
insert into tickets values(11,4,to_date('201604101030','yyyymmddhh24mi')); 
commit; 

ответ

1

Также возможно без аналитических функций.

select * from tickets t1 
    where exists (
    select 1 from tickets t2 
     where t1.client_id = t2.client_id 
     and t1.start_time>t2.start_time 
     and t1.start_time<=t2.start_time+14 
    ); 
1

Вы можете делать то, что хотите, с помощью аналитических функций. Я думаю, что это логика:

select t.* 
from (select t.*, 
      row_number() over (partition by client_id order by start_time) as seqnum, 
      lag(start_time) over (partition by client_id order by start_time) as prev_st 
     from tickets t 
    ) t 
where (start_time - prev_st) < 14 and seqnum >= 2; 

Я понимаю, что я не знаю, что «это» относится к в (б) - преемник на запись в вопросе. Как написано, seqnum >= 2 является избыточным, поскольку первая запись для каждого клиента не отвечает первому состоянию (prev_st - NULL).

Если это не совсем то, что вам нужно, то некорректная комбинация row_number(), lag() и lead().

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