【问题标题】:Oracle SQL - How to contrain related records timewiseOracle SQL - 如何按时包含相关记录
【发布时间】:2016-04-11 10:30:27
【问题描述】:

鉴于下面列出的数据,如何只选择记录,其中:

a) 至少存在 1 个相同 client_id 的先前票证,并且

b) 每张前程票的最大时差不得超过 14 天。换句话说,如果票证具有 a) 中所述的后继者,并且该后继者是在 >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;

【问题讨论】:

    标签: sql oracle analytic-functions


    【解决方案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
       );
    

    【讨论】:

      【解决方案2】:

      您可以使用分析函数为所欲为。我认为这是逻辑:

      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;
      

      我意识到我不知道 (b) 中的“它”指的是什么——相关记录的继任者。正如所写,seqnum &gt;= 2 是多余的,因为每个客户端的第一条记录都不符合第一个条件(prev_stNULL)。

      如果这不是您所需要的,那么 row_number()lag()lead() 的某种组合似乎是正确的。

      【讨论】:

        猜你喜欢
        • 2020-03-30
        • 2019-06-27
        • 2016-02-19
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        相关资源
        最近更新 更多