有这样一个数据库
姓名  旷工日期
张三  2011-9-14
张三  2011-9-15
张三  2011-9-16
李四  2011-9-10
李四  2011-9-12
李四  2011-9-14
张三  2011-9-20
想这样实现,按姓名和连续三天以上旷工显示,如张三连续旷工三天的为2011-9-14,2011-9-15,2011-9-16三条显示,而2011-9-20则无需显示,李四旷工的三天不是连续的,不需要显示。

解决方案 »

  1.   

    CREATE TABLE [dbo].[OA](
    [F_NAME] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [F_DATE] [datetime] NULL
    )insert into oa values('张三','20110914')
    insert into oa values('张三','20110915')
    insert into oa values('张三','20110916')
    insert into oa values('李四','20110910')
    insert into oa values('李四','20110912')
    insert into oa values('李四','20110914')
    insert into oa values('张三','20110920')SELECT A.* FROM OA A
    INNER JOIN OA B
    ON A.F_NAME = B.F_NAME
    AND A.F_DATE = B.F_DATE - 1
    INNER JOIN OA C
    ON B.F_NAME = C.F_NAME
    AND B.F_DATE = C.F_DATE - 1
      

  2.   

    create table tb(姓名 nvarchar(10),旷工日期 datetime)
    insert into tb select '张三','2011-9-14'
    insert into tb select '张三','2011-9-15'
    insert into tb select '张三','2011-9-16'
    insert into tb select '李四','2011-9-10'
    insert into tb select '李四','2011-9-12'
    insert into tb select '李四','2011-9-14'
    insert into tb select '张三','2011-9-20'
    go
    select a.姓名,a.旷工日期,b.旷工日期,c.旷工日期
    from tb a inner join tb b on a.姓名=b.姓名 and datediff(d,a.旷工日期,b.旷工日期)=1
    inner join tb c on c.姓名=b.姓名 and datediff(d,b.旷工日期,c.旷工日期)=1
    /*
    姓名         旷工日期                    旷工日期                    旷工日期
    ---------- ----------------------- ----------------------- -----------------------
    张三         2011-09-14 00:00:00.000 2011-09-15 00:00:00.000 2011-09-16 00:00:00.000(1 行受影响)*/
    go
    drop table tb
      

  3.   

    正好今天也碰到这个问题,提出一个更简介的SQL
    SELECT u,lxid FROM (
    SELECT u,DAY(d)-ROW_NUMBER() over ( PARTITION BY u order by d) lxid FROM (
    SELECT '张三' u, '2011-9-14' d union all
    SELECT '张三' u, '2011-9-15' d union all
    SELECT '张三' u, '2011-9-16' d union all
    SELECT '李四' u, '2011-9-10' d union all
    SELECT '李四' u, '2011-9-12' d union all
    SELECT '李四' u, '2011-9-14' d union all
    SELECT '张三' u, '2011-9-20' d) T
    ) X GROUP BY u,lxid HAVING COUNT(*)>=3  --这里的3可用参数,不是固定的如果查询“真实”的连续(考虑节假日的问题,如:周五和下周一也应该是联系的),参照这种思想也可以解决
    大家可以自己思考一下,如有疑问欢迎交流!