Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2005排名函数_Sql Server 2005_Function_Rank - Fatal编程技术网

Sql server 2005 SQL Server 2005排名函数

Sql server 2005 SQL Server 2005排名函数,sql-server-2005,function,rank,Sql Server 2005,Function,Rank,我在SQL Server 2005中遇到问题: 假设我有一个表PLAYER(stringplayer,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 问题是,当玩家不活跃时,

我在SQL Server 2005中遇到问题:

假设我有一个表
PLAYER
stringplayer,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)
对不起,我的英语很糟糕,我希望我已经解释了我的观点

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
结果:

Name                 score       position
-------------------- ----------- --------------------
PETER                5000        NULL
JOHN                 10000       1
CHARLES              2500        2
PAUL                 5000        NULL
试试这个:

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

…但问题是实际上我的“活动”列不是布尔值, 实数列是一个称为“state”的整数,它必须等于1才能为 活跃的。在这种情况下,代码应该是怎样的

那么这应该是可行的:

POSITION = 
   RANK()OVER(ORDER BY CASE WHEN State = 1 THEN 0 ELSE 1 END ASC, score DESC) 
试试这个:

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

…但问题是实际上我的“活动”列不是布尔值, 实数列是一个称为“state”的整数,它必须等于1才能为 活跃的。在这种情况下,代码应该是怎样的

那么这应该是可行的:

POSITION = 
   RANK()OVER(ORDER BY CASE WHEN State = 1 THEN 0 ELSE 1 END ASC, score DESC) 
试试这个:

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
与已回答的查询相比,我不确定这会有多高效,但它更容易理解。

尝试以下方法:

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


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

只要位类型不转换为int(因为它已经有值>1)就可以工作。@TimSchmelter为什么/何时转换为int?我认为active是一种状态,因为OP使用了值1,空和3。闻起来它实际上是一个
int
(或将是)。如果将其更改为
int
数据类型,则排名将是错误的,因为OP希望按分数排序不活动(先按分数排序活动,然后是不活动)。@TimSchmelter-
3
是查询的结果,不活动。根据第一行,Active是bool。这对我来说很好,但问题是实际上我的“Active”列不是布尔值,实际列是一个称为“state”的整数,它必须等于1才能激活。在这种情况下,代码应该如何工作?只要位类型不会转换为int(因为它已经有值>1)。@TimSchmelter为什么/何时转换为int?我认为active是一种状态,因为OP使用了值1、NULL和3。闻起来它实际上是一个
int
(或将是)。如果将其更改为
int
数据类型,则排名将是错误的,因为OP希望按分数排序不活动(先按分数排序活动,然后是不活动)。@TimSchmelter-
3
是查询的结果,不活动。根据第一行,Active是bool。这对我来说很好,但问题是实际上我的“Active”列不是布尔值,实际列是一个称为“state”的整数,它必须等于1才能激活。在这种情况下,代码应该是怎样的?那不起作用,我得到了非活动的最高职位column@martin.softpro:我无法复制此项,此项按活动最高分数排序,然后按非活动最高分数排序。当然,对于inactive,这不会返回
null
。不管怎么说,我看到你成功了:)那没用,我得到了非活跃者的最高职位column@martin.softpro:我无法复制此项,此项按活动最高分数排序,然后按非活动最高分数排序。当然,对于inactive,这不会返回
null
。不管怎样,我看到你成功了:)不活跃玩家的排名会发生什么变化??你想给他们排名还是只给活跃玩家排名?我只想给活跃玩家排名。非活跃玩家必须有空值,非活跃玩家的排名会发生什么变化??你想给他们排名还是只给活跃玩家排名?我只想给活跃玩家排名。非活动列必须具有空值un position列