34,588
社区成员
发帖
与我相关
我的任务
分享
--数据直接用一楼的(此处略)
--查询
;with T as(
select ROW_NUMBER() over(partition by usrid order by getdate()) id,* from tb
)
select usrid,t1 from T where (id-1)%5=0
/*查询结果
usrid t1
----------- -----------------------
1 2012-11-11 11:11:00.000
1 2012-11-11 11:16:00.000
1 2012-11-11 11:21:00.000
1 2012-11-11 11:26:00.000
2 2012-11-11 11:11:00.000
2 2012-11-11 11:16:00.000
2 2012-11-11 11:21:00.000
2 2012-11-11 11:26:00.000
(8 行受影响)
*/
;with cte as(--这里的cte 相当于一个临时表
select * from tb a where not exists(select 1 from tb where usrid=a.usrid and t1<a.t1)
--这一句取的是分别同一usrid的最小时间的记录
--对应下面的记录:
-- 1 2012-11-11 11:11:00.000
-- 2 2012-11-11 11:11:00.000
union all
--用于联合上面和下面的结果集
select a.* from tb a inner join cte b on a.usrid=b.usrid and datediff(mi,b.t1,a.t1)=5
--这条语句基本就是这个查询语句的点睛之笔
--inner join 内联取交集 注意这里内联的对象不是"tb"而是"cte "(上面的有说到)这里其实就好比
一般我们在程序中写的递归以.这里就是以上一次的结果记录作为这一次的查询条件(datediff(mi,b.t1,a.t1)=5)做查询。
--第一次得到结果集
1 2012-11-11 11:16:00.000
2 2012-11-11 11:16:00.000
--第二次得到结果集
1 2012-11-11 11:21:00.000
2 2012-11-11 11:21:00.000
--第三次得到结果集
1 2012-11-11 11:26:00.000
2 2012-11-11 11:26:00.000
--第四次
--.........
)
select * from cte order by usrid,t1