SQL按连续日期显示

rongguo52013 2011-09-20 01:52:03
有这样一个数据库
姓名 旷工日期
张三 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则无需显示,李四旷工的三天不是连续的,不需要显示。
...全文
243 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ds25871175 2013-05-25
  • 打赏
  • 举报
回复
引用
gdfg
popliu 2012-05-25
  • 打赏
  • 举报
回复
正好今天也碰到这个问题,提出一个更简介的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可用参数,不是固定的

如果查询“真实”的连续(考虑节假日的问题,如:周五和下周一也应该是联系的),参照这种思想也可以解决
大家可以自己思考一下,如有疑问欢迎交流!
rongguo52013 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qianjin036a 的回复:]
SQL code
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 ……
[/Quote]
你这样不行,要是连续旷工三天以上的呢,我要的是旷工三天或三天以上,你这样只限制在三天。
-晴天 2011-09-20
  • 打赏
  • 举报
回复
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

txyangxy 2011-09-20
  • 打赏
  • 举报
回复


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
geniuswjt 2011-09-20
  • 打赏
  • 举报
回复
3个exists

22,297

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧