疑难问题 一批数据里面 想抽出 时间带重叠的数据

舞台中央的我 2014-10-17 09:29:19
现有一批数据
id 车 人 出车开始时间 出车结束时间
1 京1 小李 2014/10/01 8:00:00 2014/10/01 10:00:00
2 京1 小王 2014/10/01 9:00:00 2014/10/01 12:00:00
3 京1 小李 2014/10/01 12:00:00 2014/10/01 19:00:00
4 京2 小三 2014/10/02 12:00:00 2014/10/02 19:00:00
5 京3 小四 2014/10/02 12:00:00 2014/10/02 19:00:00
6 京3 小四 2014/10/02 16:00:00 2014/10/02 17:00:00


希望 就是 对于一辆车 开始时间到结束时间 有 重叠的 (时间带有交集的)的话 抽出 ID 车 人 出车开始时间

...全文
110 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaodongni 2014-10-18
  • 打赏
  • 举报
回复
引用 4 楼 reenjie 的回复:
综合分析,#1和#3的方法,发现都有问题。 楼主要求是抓取时间重叠的记录(每车要么为0条记录要么至少2条记录) #1的方法只抓取开始时间或结束时间在另一条记录(记录2)的开始时间或结束时间之间的记录(记录1),记录1是选取出来,但是记录2则没有选取出来。 #3的方法虽然可以抓取两条记录,但是遇到下面的数据,则会抓取有误。 车1 2014/10/01 8:00:00 2014/10/01 10:00:00 车1 2014/10/01 8:30:00 2014/10/01 9:00:00 车1 2014/10/01 9:30:00 2014/10/01 19:00:00 这样的#3的方法只能抓取前2条记录而第3条记录则抓取不到。 对#3的方法稍微调整一下

with cte as 
(
select *,row_number() over(partition by 车 order by 出车开始时间 asc) as rId from tablename where 出车结束时间>=出车开始时间
)
select * from cte as a  where exists (select * from cte where ((rId>a.rID and 出车开始时间<=a.出车结束时间) or (rId<a.rID and 出车结束时间 >=a.出车开始时间)) and 车=a.车) 


select * from tablename as a 
where exists (select 1 from tablename as b where  a.id!=b.id and a.车=b.车 and
((b.出车开始时间 between a.出车开始时间 
and a.出车结束时间) or (b.出车结束时间 between a.出车开始时间 
and a.出车结束时间)))
我的可以选出记录2 的。1楼夸号弄错了。对于记录2 存在记录1满足记录1的出车结束时间在记录2的出车开始时间和结束时间之内。
reenjie 2014-10-18
  • 打赏
  • 举报
回复
综合分析,#1和#3的方法,发现都有问题。 楼主要求是抓取时间重叠的记录(每车要么为0条记录要么至少2条记录) #1的方法只抓取开始时间或结束时间在另一条记录(记录2)的开始时间或结束时间之间的记录(记录1),记录1是选取出来,但是记录2则没有选取出来。 #3的方法虽然可以抓取两条记录,但是遇到下面的数据,则会抓取有误。 车1 2014/10/01 8:00:00 2014/10/01 10:00:00 车1 2014/10/01 8:30:00 2014/10/01 9:00:00 车1 2014/10/01 9:30:00 2014/10/01 19:00:00 这样的#3的方法只能抓取前2条记录而第3条记录则抓取不到。 对#3的方法稍微调整一下

with cte as 
(
select *,row_number() over(partition by 车 order by 出车开始时间 asc) as rId from tablename where 出车结束时间>=出车开始时间
)
select * from cte as a  where exists (select * from cte where ((rId>a.rID and 出车开始时间<=a.出车结束时间) or (rId<a.rID and 出车结束时间 >=a.出车开始时间)) and 车=a.车) 
reenjie 2014-10-17
  • 打赏
  • 举报
回复
引用 2 楼 reenjie 的回复:

with cte as 
(
select *,row_number() over(partition by 车 order by 出车开始时间 asc) as rId from tablename 
)
select * from cte as a  where exists (select * from cte where ((rId=a.rID+1 and 出车开始时间<=a.出车结束时间) or (rId=a.rID-1 and 出车结束时间 <=a.出车开始时间)) and 车=a.车) 
小调一下

with cte as 
(
select *,row_number() over(partition by 车 order by 出车开始时间 asc) as rId from tablename 
)
select * from cte as a  where exists (select * from cte where ((rId=a.rID+1 and 出车开始时间<=a.出车结束时间) or (rId=a.rID-1 and 出车结束时间 >=a.出车开始时间)) and 车=a.车) 
reenjie 2014-10-17
  • 打赏
  • 举报
回复

with cte as 
(
select *,row_number() over(partition by 车 order by 出车开始时间 asc) as rId from tablename 
)
select * from cte as a  where exists (select * from cte where ((rId=a.rID+1 and 出车开始时间<=a.出车结束时间) or (rId=a.rID-1 and 出车结束时间 <=a.出车开始时间)) and 车=a.车) 
xiaodongni 2014-10-17
  • 打赏
  • 举报
回复

select * from tablename as a 
where exists (select 1 from tablename as b where  a.id!=b.id and a.车=b.车 and
b.出车开始时间 between a.出车开始时间 
and a.出车结束时间 or (b.出车结束时间 between a.出车开始时间 
and a.出车结束时间))

22,210

社区成员

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

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