【发布时间】:2016-01-04 08:06:02
【问题描述】:
我只需要关于如何加快代码速度的建议。我应该指望每年的基数,一些学生的成绩如何提高并以百分比计算。另外请记住,我每年大约有 100k-150k 条记录。
基本上最终结果是这样的,所以在 20150131 年底,2% 的学生完成了 A 级和 B 级,依此类推。
Grade Date B C
A 20150131 2% 3%
B 20150131 88% 85%
C 20150131 10% 12%
A 20140131 2% 3%
B 20140131 88% 85%
C 20140131 10% 12%
A 20130131 2% 3%
B 20130131 88% 85%
C 20130131 10% 12%
输入看起来像这样......只是关于学生和他在特定日期的成绩的信息
Student Date Grade
1 20150131 A
2 20150131 C
3 20150131 A
1 20140131 B
2 20140131 B
3 20140131 A
我的代码如下所示:
WHILE @StartDateInt > @PeriodSpan
BEGIN
while @y <= @CategoriesCount
BEGIN
set @CurrentGr = (Select Grade from #Categories where RowID = @y)
set @CurrentGrCount = (Select COUNT(Students) from #TempTable where Period = @PeriodSpan and Grade = @CurrentGr)
set @DefaultCurrentGr = (Select Grade from #Categories where RowID = @y)
insert into Grade_MTRX (Student, Period, Grades_B, SessionID)
select temp1.Grade, @PeriodNextSpan as Period, COUNT(Grades_B)/@CurrentGrCount as 'Grades_B', @SessionID
from #TempTable temp1
join #TempTable temp2 on temp1.Student = temp2.Student and temp1.Period + 10000 = temp2.Period
where temp1.Grade = @CurrentGr and temp2.Grade = 'C' and temp1.Period = @PeriodSpan
group by temp1.Grade, temp1.Period
update Grade_MTRX set Grades_C = (
select COUNT(Grades_C)/@CurrentGrCount
from #TempTable
where Grade = 'C' and Period = @PeriodNextSpan)
where Category = @CurrentGr and Period = @PeriodNextSpan
end
end
我知道 SQL Server 不喜欢 while 循环,因为我知道它会扼杀它的性能...但我在 while 循环内使用while...经过多年,每个年级并且只是计算它们并且...首先我插入 1 行当前成绩,然后我不断更新该行直到它完全填充。
我确实知道这很糟糕,但最后这就是为什么我在这里学习更好的方法来实现这一点。
提前谢谢你!
【问题讨论】:
-
分享输入和想要的输出,你会得到不循环的答案
-
您应该了解
GROUP BY和子查询。 -
你只会有A、B和C等级?
-
是的,锻炼只是让 A、B、C 变得简单
-
Sql-server 不喜欢或不喜欢 while 循环。 #TempTable 的声明在哪里?它有索引吗?您正在扫描和汇总多少数据? While 循环条件中的变量退出它们的 SET 命令在哪里?
标签: sql sql-server performance tsql while-loop