sqlserver 多个时间合并成时间段

CodeofWorker 2017-08-24 03:27:06
CREATE TABLE #tmptable(
rq datetime NOT NULL PRIMARY KEY CLUSTERED,
sn int IDENTITY(1,1) NOT NULL,
userId int,
)
GO
INSERT #tmptable VALUES('20170703', 1)
INSERT #tmptable VALUES('20170704', 1)
INSERT #tmptable VALUES('20170705', 1)
INSERT #tmptable VALUES('20170706', 1)
INSERT #tmptable VALUES('20170707', 1)
INSERT #tmptable VALUES('20170708', 1)
INSERT #tmptable VALUES('20170710', 1)
INSERT #tmptable VALUES('20170711', 1)
INSERT #tmptable VALUES('20170712', 1)
INSERT #tmptable VALUES('20170713', 1)
INSERT #tmptable VALUES('20170714', 1)
INSERT #tmptable VALUES('20170715', 1)
INSERT #tmptable VALUES('20170717', 1)
INSERT #tmptable VALUES('20170714', 2)
INSERT #tmptable VALUES('20170715', 2)
INSERT #tmptable VALUES('20170717', 2)
GO

能不能不用循环之类的将它们合并成一条记录:

开始日期 结束日期 USERID
=========== ================= =========
2017-07-03 2017-07-17 1
2017-07-14 2017-07-17 2
...全文
742 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeofWorker 2017-08-31
  • 打赏
  • 举报
回复
引用 5 楼 RINK_1 的回复:
set datefirst 1 ;with cte1 as (select isnull(c.userId,A.userId) as userid, C.sn,C.rq, case when datepart(weekday,DATEADD(DD,number,rq_min)) in (6,7) then DATEADD(DD,number,rq_min) else C.rq end as rq_new, B.number as rn_1 from (select userid,MIN(rq) as rq_min,MAX(rq) as rq_max from #tmptable group by userid) as A JOIN master.dbo.spt_values B on DATEDIFF(DD,rq_min,rq_max)>=number left join #tmptable C ON A.userId=C.userId and DATEADD(DD,number,rq_min)=C.rq where type='p' ), cte2 as ( select *,ROW_NUMBER() over (partition by userid order by rq_new) as rn_2 from cte1 where ISNULL(rq_new,'')<>'') select userid,MIN(rq_new) as 开始日期,MAX(rq_new) as 结束日期 from cte2 group by userid,rn_1-rn_2 order by userid,MIN(rq_new)
测试了下,没有得到想要的结果。
CodeofWorker 2017-08-31
  • 打赏
  • 举报
回复
引用 4 楼 zengertao 的回复:
[quote=引用 3 楼 CodeofWorker 的回复:] 可能是我说得不明白, 有一个条件,如果不是连续的记录要分开两条 什么是不是连续的,就是如7月8与7月10是隔了一个星期天的,这是我认为是用户连续操作的 但如果记录是7月8和7月11的隔开非周六日的情况,我认为这是非连续操作 请上面大哥重新再看看怎么处理
http://bbs.csdn.net/topics/392233344参考下吧,换汤不换药[/quote] 感谢你的回复,这个的确在有两个表的情况下是可行的,但不合乎我的数据库设计,因为我这个已经是结果表查出来的,但目前要得到的是单个表来去计算是否有非周日连续日期的问题和你给的不一样。
RINK_1 2017-08-24
  • 打赏
  • 举报
回复
set datefirst 1 ;with cte1 as (select isnull(c.userId,A.userId) as userid, C.sn,C.rq, case when datepart(weekday,DATEADD(DD,number,rq_min)) in (6,7) then DATEADD(DD,number,rq_min) else C.rq end as rq_new, B.number as rn_1 from (select userid,MIN(rq) as rq_min,MAX(rq) as rq_max from #tmptable group by userid) as A JOIN master.dbo.spt_values B on DATEDIFF(DD,rq_min,rq_max)>=number left join #tmptable C ON A.userId=C.userId and DATEADD(DD,number,rq_min)=C.rq where type='p' ), cte2 as ( select *,ROW_NUMBER() over (partition by userid order by rq_new) as rn_2 from cte1 where ISNULL(rq_new,'')<>'') select userid,MIN(rq_new) as 开始日期,MAX(rq_new) as 结束日期 from cte2 group by userid,rn_1-rn_2 order by userid,MIN(rq_new)
繁花尽流年 2017-08-24
  • 打赏
  • 举报
回复
引用 3 楼 CodeofWorker 的回复:
可能是我说得不明白, 有一个条件,如果不是连续的记录要分开两条 什么是不是连续的,就是如7月8与7月10是隔了一个星期天的,这是我认为是用户连续操作的 但如果记录是7月8和7月11的隔开非周六日的情况,我认为这是非连续操作 请上面大哥重新再看看怎么处理
http://bbs.csdn.net/topics/392233344参考下吧,换汤不换药
CodeofWorker 2017-08-24
  • 打赏
  • 举报
回复
可能是我说得不明白, 有一个条件,如果不是连续的记录要分开两条 什么是不是连续的,就是如7月8与7月10是隔了一个星期天的,这是我认为是用户连续操作的 但如果记录是7月8和7月11的隔开非周六日的情况,我认为这是非连续操作 请上面大哥重新再看看怎么处理
二月十六 2017-08-24
  • 打赏
  • 举报
回复
SELECT  MIN(rq) AS 开始日期 ,
MAX(rq) AS 结束日期 ,
userId
FROM #tmptable
GROUP BY userId


繁花尽流年 2017-08-24
  • 打赏
  • 举报
回复
SELECT userId,MIN(RQ) AS RQ1,MAX(RQ) AS RQ2 
FROM #tmptable 
GROUP BY userId

22,302

社区成员

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

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