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