USE DNWorld
GO
SELECT TOP (100) WITH TIES PvPExp
FROM PvPRanking
ORDER BY PVPExp DESC
UPDATE PVPRanking
SET PVPLevel = 26
WHERE TOP(1) = 1
错误:
消息156,级别15,状态1,服务器NS544979,过程,第0行 关键字“ TOP”附近的语法不正确。 [42000] [Microsoft] [SQL Server Native Client 11.0] [SQL Server]关键字“ TOP”附近的语法不正确。 (156)
我已经成功选择并在查询中订购了PvPExp。
我想将PVPLEVEL = 26设置为#1最佳结果。那是行不通的。
然后我要设置#2-#5 Top结果为某个值。
依此类推。请帮助
答案 0 :(得分:0)
具有RANK()
窗口功能:
WITH cte AS (
SELECT *, RANK() OVER (ORDER BY PVPExp DESC) AS rn
FROM PvPRanking
)
UPDATE cte
SET PVPLevel = CASE rn
WHEN 1 THEN 26
ELSE ?
END
WHERE rn <= 5
将?
替换为您要设置为#2-#5 Top 行的值。
如果您还想为其设置不同的值:
.............................
SET PVPLevel = CASE rn
WHEN 1 THEN 26
WHEN 2 THEN ?
WHEN 3 THEN ?
WHEN 4 THEN ?
WHEN 5 THEN ?
END
.............................
答案 1 :(得分:0)
您可以将row_number()与CTE一起使用。即:
with rankings (PvpExp, rowNo) as
(
SELECT PvPExp, row_number() over (order by PvpExp desc)
FROM PvPRanking
)
UPDATE PVPRanking
SET PVPLevel = case
when r.rowNo = 1 then 26
when r.rowNo > 1 and r.rowNo < 6 then xx
-- other settings
end
from PVPRanking pr
inner join rankings r on pr.PVPExp = r.PVPExp;
根据实际需要,您可能需要的是Rank(),DenseRank()...而不是row_number()。