0

我有一个查询结果,例如

|----------------------------------------------|
|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 合并的结果

4

2 回答 2

3
select 
    StaffId,
    BranchId,
    MIN(StartTime),
    MAX(EndTime),
    PatientId
from
(
select *,       
    ROW_NUMBER() over (order by starttime) 
      - ROW_NUMBER() over (partition by isnull(PatientID,-1) order by starttime) rn     
from @results
) v
group by staffid, branchid, patientid, rn
order by MIN (starttime)

我不确定 @results 表中的 StaffID 和 BranchID 是否会有所不同,因此如果可以的话,您可能需要对其进行调整。

于 2012-08-23T10:04:39.963 回答
0

您可以使用游标,但性能不会很好地扩展:

    create table #tempTimes (
        staffid int,
        branchid int,
        startTime datetime,
        endTime datetime,
        patientid int)

    insert into #temptimes values (1,1,'2012-09-09 09:30', '2012-09-09 09:35', null)
    insert into #temptimes values (1,1,'2012-09-09 09:35', '2012-09-09 09:40', null)
    insert into #temptimes values (1,1,'2012-09-09 09:40', '2012-09-09 09:45', null)
    insert into #temptimes values (1,1,'2012-09-09 09:45', '2012-09-09 09:55', 1)
    insert into #temptimes values (1,1,'2012-09-09 09:55', '2012-09-09 10:00', null)
    insert into #temptimes values (1,1,'2012-09-09 10:00', '2012-09-09 10:05', null)
    insert into #temptimes values (1,1,'2012-09-09 10:05', '2012-09-09 10:20', 2)

    declare @currentPeriodStart datetime
    declare @currentPeriodEnd datetime
    declare @startTime datetime
    declare @endTime datetime
    declare @lastEndTime datetime
    declare @patientId int

    declare myCurs cursor for select startTime, endTime, patientid from #tempTimes order by startTime 

    open myCurs

    fetch next from myCurs into @startTime, @endTime, @patientId

    while @@fetch_status = 0
    begin
        if @patientId is null
        begin
            if (@currentPeriodStart is null)
                set @currentPeriodStart = @startTime

            set @currentPeriodEnd = @endTime
        end else
        begin
            print   cast(@currentPeriodStart as nvarchar) + ' to ' + cast(@currentPeriodEnd as nvarchar)
            set @currentPeriodStart = null
        end

        fetch next from myCurs into @startTime, @endTime, @patientId
    end

    close myCurs
    deallocate myCurs
于 2012-08-23T10:16:32.183 回答