Sql server 2005 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 问题是,当玩家不活跃时,
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列