我有一个查询结果,例如
|----------------------------------------------|
|StaffId|BranchId|StartTime|EndTime |PatientId |
|----------------------------------------------|
|1 |1 |09:30:00 |09:35:00|Null |
|1 |1 |09:35:00 |09:40:00|Null |
|1 |1 |09:40:00 |09:55:00|1 |
|1 |1 |09:55:00 |10:00:00|Null |
|1 |1 |10:00:00 |10:05:00|Null |
|1 |1 |10:05:00 |10:20:00|2 |
|1 |1 |10:20:00 |10:25:00|NULL |
|1 |1 |10:25:00 |10:40:00|3 |
|1 |1 |10:40:00 |10:45:00|Null |
|1 |1 |10:45:00 |10:50:00|Null |
|1 |1 |10:50:00 |10:55:00|Null |
|1 |1 |10:55:00 |11:00:00|Null |
|----------------------------------------------|
但我希望能够对所有未使用的时间段(没有患者 ID 的时间段)进行分组,所以结果是
|----------------------------------------------|
|StaffId|BranchId|StartTime|EndTime |PatientId |
|----------------------------------------------|
|1 |1 |09:30:00 |09:40:00|Null |
|1 |1 |09:40:00 |09:55:00|1 |
|1 |1 |09:55:00 |10:05:00|Null |
|1 |1 |10:05:00 |10:20:00|2 |
|1 |1 |10:20:00 |10:25:00|NULL |
|1 |1 |10:25:00 |10:40:00|3 |
|1 |1 |10:40:00 |11:00:00|Null |
|----------------------------------------------|
虽然不太确定如何执行此操作,但我们将不胜感激任何指导。不确定是否更容易,但查询的结果是通过使用 sql 与患者仅以 5 分钟间隔加入一个表来获得的
INSERT INTO @Results(BranchId, StaffId, StartTime, EndTime)
SELECT us.BranchId, us.StaffId, us.StartTime, us.EndTime
FROM @UnusedSlots us
left join @Results r
on (NOT ((r.StartTime >= us.EndTime)
OR (r.EndTime <= us.StartTime))) AND
(us.StaffId = r.StaffId)
where r.BranchId is Null
其中@UnusedSlots 是可用的 5 分钟时段,@Results 包含预订的时段(带有患者 ID)。如果有一种方法可以将合并构建到此语句中,那就更好了。
我以为我可以使用Min(StartTime)
,Max(EndTime)
如果我可以在没有 PatientId 的情况下隔离相邻的结果,但我不知道该怎么做,我会一直得到一个从 09:30 到 11:00 合并的结果