Tsql 如何根据其他两列填充列

Tsql 如何根据其他两列填充列,tsql,Tsql,我有空数字栏的课表 我怎样才能把每节课的课时数填在表格里,这样就可以把每节课的课时数按顺序排好呢? 这两个课时不能互相交叉。每所学校都定义了自己的课时模式 示例数据集 我做了什么: 按学号和开始时间排序 使用光标将下一个数字插入行中,每次更改学校ID时从1开始。 编辑: 带光标的解决方案 select -- top 20 LH.[Id], [StartTime], [EndTime], [SchoolId] into #LH fr

我有空数字栏的课表

我怎样才能把每节课的课时数填在表格里,这样就可以把每节课的课时数按顺序排好呢? 这两个课时不能互相交叉。每所学校都定义了自己的课时模式

示例数据集

我做了什么:

按学号和开始时间排序 使用光标将下一个数字插入行中,每次更改学校ID时从1开始。 编辑:

带光标的解决方案

select -- top 20
        LH.[Id],
        [StartTime],
        [EndTime],
        [SchoolId]
into #LH
from
    LessonHour as LH
    join RowStatus as RS on LH.RowStatusId = RS.Id
where 
    RS.IsActive = 1

select * from #LH order by SchoolId, StartTime

declare @id uniqueidentifier, @st time(7), @et time(7), @sid uniqueidentifier
declare @prev_sid uniqueidentifier = NEWID()
declare @i int = 1
declare cur scroll cursor for
select * from #LH order by SchoolId, StartTime
open cur;
fetch next from cur into @id, @st, @et, @sid
while @@FETCH_STATUS = 0
begin
    --print @prev_sid
    if @sid <> @prev_sid
    begin
        set @i = 1
    end

    update LessonHour set Number = @i where Id = @id

    print @i
    set @i = @i + 1

    set @prev_sid = @sid
    fetch next from cur into @id, @st, @et, @sid
end;
close cur;
deallocate cur;

drop table #LH
这是我所追求的结果

这行得通吗

CREATE TABLE [dbo].[LessonHour]
(
    [Id] [uniqueidentifier] NOT NULL,
    [StartTime] [time](7) NOT NULL,
    [EndTime] [time](7) NOT NULL,
    [SchoolId] [uniqueidentifier] NOT NULL,
    [Number] AS DATEDIFF(hour,[StartTime],[EndTime])
)
因此,如果我正确理解了这个问题,您需要一个计算列,它接受[StartTime]和[EndTime]的值,并以整数形式返回该课程的小时数。上面的表定义应该可以做到这一点


合并StackOverflow问题和 :


不。我需要计算每所学校的课时数。在运行UPDATE[dbo].[LessonHour]SET[number]=DATEDIFFhour,[StartTime],[EndTime]之后,我知道您遇到了一个问题,您知道如何解决它。但你的问题是什么?您是否实施并测试了您的解决方案?您遇到任何问题了吗?或者您想知道是否有更好的方法来解决吗?非常不清楚,但让我们试试ROW_NUMBER@WernerHenze,我正在寻找更好的解决方案。我不喜欢使用游标,但我不知道如何用其他方法来做。我喜欢,我将尝试一下。如果它适合您,请告诉我。如果是的话,我会把它作为答案贴出来。
CREATE TABLE [dbo].[LessonHour]
(
    [Id] [uniqueidentifier] NOT NULL,
    [StartTime] [time](7) NOT NULL,
    [EndTime] [time](7) NOT NULL,
    [SchoolId] [uniqueidentifier] NOT NULL,
    [Number] AS DATEDIFF(hour,[StartTime],[EndTime])
)
with cte as (
    select number, ROW_NUMBER() OVER(partition by schoolid order by starttime asc) as r from lessonhour
)
update cte
set number = r