0

我在 SQL Server 2005 中有一个问题:

假设我有表PLAYER( string player, int score, bool Active) 和这个查询:

SELECT PLAYER.player AS NAME,
   PLAYER.score AS SCORE,
   POSITION = CASE WHEN PLAYER.Active THEN RANK()OVER(ORDER BY score desc) else NULL end
from PLAYER

问题是当玩家不活跃时,生成的位置不是连续的。

例如 :

JOHN,10000,1
PETER,5000,NULL (NOT ACTIVE)
CHARLES,2500,3 (SHOULD HAVE POSITION 2, NOT 3)

对不起我糟糕的英语,我希望我已经解释了我的观点

4

3 回答 3

2
declare @Player table
(
  player varchar(20),
  score int,
  state int
)

insert into @Player values ('JOHN', 10000, 1)
insert into @Player values ('PETER', 5000, NULL)
insert into @Player values ('PAUL', 5000, 2)
insert into @Player values ('CHARLES', 2500, 1)

select player as Name,
       score,
       case
          when state = 1 then
            rank() over(partition by state order by score desc)
          else null
       end as position
from @Player     

结果:

Name                 score       position
-------------------- ----------- --------------------
PETER                5000        NULL
JOHN                 10000       1
CHARLES              2500        2
PAUL                 5000        NULL
于 2012-05-21T13:24:50.143 回答
1

试试这个:

POSITION = 
   RANK()OVER(ORDER BY CASE WHEN Active IS NULL THEN 1 ELSE 0 END ASC, score DESC) 

编辑

...但问题是实际上我的“活动”列不是布尔值,真正的列是一个称为“状态”的整数,它必须等于 1 才能处于活动状态。在这种情况下代码应该如何?

那么这应该工作:

POSITION = 
   RANK()OVER(ORDER BY CASE WHEN State = 1 THEN 0 ELSE 1 END ASC, score DESC) 
于 2012-05-21T13:24:54.233 回答
0

试试这个:

SELECT PLAYER.player AS NAME, 
PLAYER.score AS SCORE, 
POSITION = RANK()OVER(ORDER BY score desc) 
from PLAYER
WHERE ACTIVE IS NOT NULL
UNION
SELECT PLAYER.player AS NAME, 
PLAYER.score AS SCORE,NULL  
from PLAYER
WHERE ACTIVE IS NULL

与已经回答的查询相比,我不确定这会有多有效,但它更容易理解。

于 2012-05-22T10:31:22.430 回答