求一sql语句(排名次)

yuna@liu 2012-02-08 02:33:22

有一学生成绩表
create table scores
(
SID INT NOT NULL,--学生编号
CLASS_ID INT ,--班级
SCORE FLOAT,--分数
classpank int ,--班内名次(默认值为NULL)
............
)




现在学生成绩表的信息已经录入(学生编号,班级编号,分数),但是classpank(班内名次)还是空的。
现在需要写个update语句,将每个学生在本班的名次得出来---

请问这个语句怎么写呢????
...全文
169 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuna@liu 2012-02-08
  • 打赏
  • 举报
回复
回复
lylongyuan

这样的话,难道学生只考一次试吗?
 你这排名要存到另一张表里吧。


恩 是的,只有一门课程
所有学生的成绩存在一张表里
yuna@liu 2012-02-08
  • 打赏
  • 举报
回复
恩 PitTroll
的办法可像可行 但是我在mysql 里面执行报错呢
AAACCCEEEFFFA 2012-02-08
  • 打赏
  • 举报
回复
忘加了个判断。
update scores set classpank =( select count(1) from scores where classpank>=1 )+1 where CLASS_ID in ( select CLASS_ID from scores SCORE = (select max(SCORE) from scores where classpank=="" ) )
AAACCCEEEFFFA 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liuxiulian 的回复:]

谢谢几位朋友
纠结啊,如果遇到学生频繁班级变动
做一个管理系统,把一批学a班移到b班,
移动后两个班级的班级排名 就都乱套了
如果遇到批量移动,先修改这些学生的classid,再调用存储过程将两个班级重新排名 ,
我觉得很耗资源,而且如果是存储过程执行失败了呢,前面的学生修改classid也不能回滚(当然可以)

[/Quote]

这样的话,难道学生只考一次试吗?
 你这排名要存到另一张表里吧。
PitTroll 2012-02-08
  • 打赏
  • 举报
回复
update scores set scores.classpank=t.classpank from scores,(select [SID],ROW_NUMBER() over( partition by CLASS_ID order by SCORE desc) as classpank from scores)t
where scores.[SID]=t.[SID];
yuna@liu 2012-02-08
  • 打赏
  • 举报
回复
谢谢几位朋友
纠结啊,如果遇到学生频繁班级变动
做一个管理系统,把一批学a班移到b班,
移动后两个班级的班级排名 就都乱套了
如果遇到批量移动,先修改这些学生的classid,再调用存储过程将两个班级重新排名 ,
我觉得很耗资源,而且如果是存储过程执行失败了呢,前面的学生修改classid也不能回滚(当然可以)
AAACCCEEEFFFA 2012-02-08
  • 打赏
  • 举报
回复
更新前先删除班内名次的值(classpank)
AAACCCEEEFFFA 2012-02-08
  • 打赏
  • 举报
回复
update scores set classpank =( select count(1) from scores  where classpank>=1 )+1 where CLASS_ID in ( select CLASS_ID from scores SCORE = (select max(SCORE) from scores )  )
bdmh 2012-02-08
  • 打赏
  • 举报
回复
先order by,然后遍历游标update,写存储过程搞定,或者自己写程序顺序更新
专心做码农 2012-02-08
  • 打赏
  • 举报
回复
我没看错的话写出来之后应该是个存储过程

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧