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 に答える