有这样一个数据库
姓名 旷工日期
张三 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则无需显示,李四旷工的三天不是连续的,不需要显示。
姓名 旷工日期
张三 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则无需显示,李四旷工的三天不是连续的,不需要显示。
[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
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
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可用参数,不是固定的如果查询“真实”的连续(考虑节假日的问题,如:周五和下周一也应该是联系的),参照这种思想也可以解决
大家可以自己思考一下,如有疑问欢迎交流!