在要求输入邮箱的文本域,请填写真实的邮件地址。非真实邮件地址,将收不到回复信息。

使用sqlserver的排名函数实现积分排名

SqlServer 清风 828℃ 0评论

背景

客户需要针对用户的积分进行排名,按照积分的多少降序进行。为了更快更好的满足客户需求,就采取了SQL Server已有的排名函数RANKDENSE_RANK来实现

RANK

返回结果集的分区内每行的排名。 行的排名是相关行之前的排名数加一。

ROW_NUMBER RANK 类似。 ROW_NUMBER 按顺序对所有行进行编号(例如: 1、2、3、4、5)。 RANK 为相应关联提供相同的数值(例如: 1、2、2、4、5)。

RANK是运行查询时计算出的临时值

语法


RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名

DENSE_RANK

此函数返回结果集分区中每行的排名,排名值没有间断。 特定行的排名等于该特定行之前不同排名值的数量加一。

语法

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
如果两个或更多行在同一分区中具有相同的排名值,那么每个行将获得相同的排名

积分排名实现

数据准备

-- 创建积分表
Create table integral
(
  userUid varchar(36),
  integralScore decimal(18,2)
);
-- 创建用户表
Create table UserInfo
(
 userUid varchar(36),
 user_name varchar(100)
);
--查询
with integral AS
(
   select userUid, ISNULL(SUM(integralScore), 0) as integralScore  from integral  group by userUid
)
,
ranks AS(
select  rank() OVER(order by integralScore desc) as ranks,integral.integralScore,UserInfo.user_name from  integral Inner Join UserInfo  on integral.userUid=UserInfo.userUid
  
)
select  * from ranks;
使用sqlserver的排名函数实现积分排名-第0张图片

rank函数实现排名,排名不连续,排名会跳过序号。如上图所示。此种情况可以使用dense_rank函数来解决,这样排名需要就会连续出现。


with integral AS
(
   select userUid, ISNULL(SUM(integralScore), 0) as integralScore  from integral  group by userUid
)
,
ranks AS(
select  dense_rank() OVER(order by integralScore desc) as ranks,integral.integralScore,UserInfo.user_name from  integral Inner Join UserInfo  on integral.userUid=UserInfo.userUid
)
select  * from ranks;
使用sqlserver的排名函数实现积分排名-第1张图片

当使用dense_rank函数排名后,就完美避免了排名跳编号的问题。



转载请注明:清风亦平凡 » 使用sqlserver的排名函数实现积分排名

喜欢 (3)or分享 (0)
支付宝扫码打赏 支付宝扫码打赏 微信打赏 微信打赏
头像
发表我的评论
取消评论

CAPTCHA Image
Reload Image
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址