我有这样的桌子
| EmpId | InTime | OutTime |
+----------+------------------+------------------+
| 101 | 01/02/2009 10:00 | 01/02/2009 20:00 |
| 101 | 01/02/2009 18:00 | 01/02/2009 20:00 |
| 102 | 01/02/2009 2:00 | 01/02/2009 2:00 |
| 103 | 01/02/2009 2:00 | 01/02/2009 5:00 |
| 104 | 01/02/2009 3:03 | 01/02/2009 5:00 |
| 104 | 01/02/2009 3:45 | 01/02/2009 7:00 |
| 105 | 01/02/2009 10:00 | 01/02/2009 22:00 |
| 106 | 01/02/2009 3:00 | 01/02/2009 4:00 |
| 106 | 01/02/2009 3:58 | 01/02/2009 4:10 |
+----------+------------------+------------------+
我想找到两者之间的记录。
我的表有超过10万条记录。
例如:
检查Empid-希望保持一致
然后检查日期和时间,第一个值从10开始到20结束,第二个记录从8开始到20结束。所以第一记录结束时间要替换为第二记录结束时间(日期和时间之间)
像这样的输出:
| EmpId | StartTime | EndTime | EndTime1 |
+----------+------------------+------------------+------------------+
| 101 | 01/02/2009 10:00 | 01/02/2009 20:00 |01/02/2009 18:00 |
| 101 | 01/02/2009 18:00 | 01/02/2009 20:00 | |
| 102 | 01/02/2009 2:00 | 01/02/2009 2:00 | |
| 103 | 01/02/2009 2:00 | 01/02/2009 5:00 | |
| 104 | 01/02/2009 3:03 | 01/02/2009 5:00 |01/02/2009 3:45 |
| 104 | 01/02/2009 3:45 | 01/02/2009 7:00 | |
| 105 | 01/02/2009 10:00 | 01/02/2009 22:00 | |
| 106 | 01/02/2009 3:00 | 01/02/2009 4:00 | 01/02/2009 3:58 |
| 106 | 01/02/2009 3:58 | 01/02/2009 4:10 | |
+----------+------------------+------------------+------------------+
最佳答案
假设您实际上想要将第一个记录的结束时间替换为第二个记录的开始时间,如您期望的输出中所示,并且还假设所有共享相同Empid的行都重叠,那么我认为一种解决方案就是这样简单的:
select empid, t1.intime starttime, t2.intime endtime t1.outtime endtime1
from table_name t1
left outer join table_name t2 on t1.empid = t2.empid and t1.intime < t2.intime order by 1,2;
使用自连接将后继项的开始时间添加到列中。使用左联接保持行没有后继