选择并订购“最佳结果”后如何操作输出

时间:2019-09-17 11:47:57

标签: sql sql-server

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结果为某个值。

依此类推。请帮助

2 个答案:

答案 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()。