Sql Update语句

asdf13225 2015-11-26 08:00:16
有一Temp表(按语文成绩降序),一共有3列,一列是语文成绩;一列是排名(1,2,3)(也可以看成行),一列(列名为ID)为空。现在的要求是在ID列加上排名(语文成绩相同时排名相同,如 1,2,2,4,4,4,7),能不能用一条update 语句写出来?,如果不能,可不可以用简短,执行快的语句写出来?
我用的是循环的方法,虽然写出来了,但是很慢。希望各位高手不吝赐教。
...全文
94 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhll2046 2015-11-30
  • 打赏
  • 举报
回复
引用 5 楼 asdf13225 的回复:
刚才发现: zhll2046 的数据中没有相同的成绩。 后来添加了数据后,虽然实现了排名,但是中国式排名(如1,2,2,3)不是(1,2,2,4)与要求有出入。
那就把DENSE_RANK 换成RANK
zhll2046 2015-11-27
  • 打赏
  • 举报
回复
DECLARE @TEMP TABLE(ROWNO INT IDENTITY,语文成绩 INT,ID INT NULL)
INSERT INTO @TEMP(语文成绩) VALUES(91),(92),(97),(95),(87),(22),(77),(65)

SELECT * FROM @TEMP

;WITH Cte AS
(
SELECT *,DENSE_RANK() OVER(ORDER BY 语文成绩 DESC) RN FROM @TEMP
)
UPDATE Cte SET ID=RN

SELECT * FROM @TEMP
asdf13225 2015-11-27
  • 打赏
  • 举报
回复
刚才发现: zhll2046 的数据中没有相同的成绩。 后来添加了数据后,虽然实现了排名,但是中国式排名(如1,2,2,3)不是(1,2,2,4)与要求有出入。
asdf13225 2015-11-27
  • 打赏
  • 举报
回复
两位都是对的。论坛里真是藏龙卧虎啊,再次感谢szx1999和zhll2046的热心解答!谢谢!
等不到来世 2015-11-26
  • 打赏
  • 举报
回复

--假设pid为主键
update Temp
set id=t.RANK
from (select pid,RANK=RANK() OVER(order by b) from tb) as t
where Temp.pid=t.pid
等不到来世 2015-11-26
  • 打赏
  • 举报
回复
表没有主键吗?

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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