oracle数据库
表ta中有两个字段为姓名,日期
姓名    日期
张三    200801
张三    200802
张三    200803
李四    200801
李四    200808
李四    200809
王五    200806
王五    200807
王五    200808现在需要把表ta中日期有中断的记录查询出来,例如李四就是因为李四的日期从200801直接跳到200808,中间的月份没有。
谢谢!

解决方案 »

  1.   

    select t.* 
    from   ta t
         , (select name, max(mon_date) - min(mon_date)+1 mon,count(1) rec from ta group by name) t1
    where  t.name  = t1.name
    and    t1.mon  <> t1.rec;因为我的测试表mon_date用的是数字类型,若是日期类型则需要处理下
      

  2.   

    create table t (user_name varchar2(10), work_date number);begin
    insert into t values('张三', 200801);
    insert into t values('张三', 200802);
    insert into t values('张三', 200803);insert into t values('李四', 200801);
    insert into t values('李四', 200808);
    insert into t values('李四', 200809);
    commit;
    end;select *
      from (select user_name, work_date, next_date - work_date gap
              from (select user_name,
                           work_date,
                           lead(work_date, 1, -1) over(partition by user_name order by work_date) next_date
                      from t))
     where gap > 1
      

  3.   

    alter session set nls_date_format='YYYYMM';SELECT user_name, work_date 
     FROM (
             SELECT user_name, work_date, lead(work_date) over(partition by user_name order by work_date) next_date 
               FROM t
          )
     WHERE months_between(to_date(next_date),to_date(work_date))>1;
      

  4.   

    select * from (SELECT ta.*, leg(to_date(日期, 'yyyymm')) over(partition by 姓名 order by 日期 asc) preone , lead(to_date(日期, 'yyyymm')) over(partition by 姓名 order by 日期) lastone, to_date(日期, 'yyyymm') currentone FROM ta) a where a.lastone=a.currentone or a.preone=a.currentone;