SQLServer RANK() 排名函数、其他相关函数

一、Rank()函数例子

(1)默认查询及对应字段 as 别名

select FOURCARD as 组名,WCBL 金额进度,tbje as 同比金额,HUBI as 环比金额 from a

在这里插入图片描述
(2)进行Rank 函数 排行 同时判断 组名不等于合计、不等于空 union all 单独加上合计

SELECT RANK() OVER( ORDER BY WCBL desc)   排行,

FOURCARD as 组名,WCBL 金额进度,tbje as 同比金额,HUBI as 环比金额  

FROM a

WHERE FOURCARD <> '合计' and FOURCARD <> ''

GROUP BY FOURCARD,WCBL,tbje,HUBI

union all

select '', FOURCARD as 组名,WCBL 金额进度,tbje as 同比金额,HUBI as 环比金额                           from a

where FOURCARD='合计'

二、ROW_NUMBER()

定义:ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询,

三、DENSE_RANK()

定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?

答:DENSE_RANK()密集的排名他和RANK()区别在于,排名的连续性,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,所以一般情况下用的排名函数就是RANK()

四、NTILE()

定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的’分区’一样 ,分为几个区,一个区会有多少个。


SQLServer RANK() 排名函数的使用

本文主要介绍了sqlserver rank() 排名函数的使用,具体如下:

-- 例子表数据  
select * from test;  
-- 统计分数  
select name,sum(achievement) achievement from test group by name;   
-- 按统计分数做排行  
select rank() over(order by sum(achievement) desc) 排行,name,sum(achievement) achievement from test group by name;

在这里插入图片描述
求助问答存储过程使用:

USE [DB]
GO
  
/****** Object:  StoredProcedure [dbo].[sp_TodayJoinUser]    Script Date: 2021/1/26 14:45:24 ******/
SET ANSI_NULLS ON
GO
  
SET QUOTED_IDENTIFIER ON
GO
  
  
-- =============================================
-- Author:      _Hey_Jude
-- Create date: 2021-01-26
-- Description: 获取今日发表帮助/回复的新用户
-- =============================================
CREATE PROCEDURE [dbo].[sp_TodayJoinUser] 
    @tableLevel int,
    @date varchar(30)
AS
Declare @Sql nvarchar(max) 
declare @minTabId int
declare @maxTabId int
declare @maxf_id int
declare @helpTableName nvarchar(max)
declare @tableCount int
  
BEGIN
     --最小f_id所在表
     set @minTabId=0
     set @tableCount=@minTabId
     --最大f_id所在表
     set @maxf_id=(select MAX(F_ID) from [Table] where F_IsDelete=0)
     set @maxTabId=@maxf_id/@tablelevel
  
     set @helpTableName='SELECT UserID, Max([F_DateTime]) AS dt FROM [Table] GROUP BY UserID'
  
     while @tableCount<=@maxTabId
     begin     
        print @tableCount
        set @helpTableName += ' UNION SELECT UserID, Max([DateTime]) as dt FROM SubTable'+cast(@tableCount as nvarchar(10))+' GROUP BY UserID '
        set @tableCount=@tableCount+1
     end
               
     set @Sql='SELECT [nikename] FROM ( 
                    SELECT UserID, RANK() OVER(PARTITION BY UserID ORDER BY dt) AS Num,dt FROM ( '+@helpTableName+' ) AS T ) AS NewT
               LEFT JOIN [UserTable] A WITH(NOLOCK) ON NewT.UserID = A.UserId WHERE Num = 1 AND dt > '''+@date+''''
  
     Exec sp_executesql @Sql
END
  
GO

partition的意思是对数据进行分区,sql语句如下

select* from ( 
select row_number() 
over(partition by [姓名] order by [打卡时间] desc) as rownum,
[姓名], [打卡时间] from [dbo].[打卡记录表]
) temp
where temp.rownum = 1

通过 partition by [姓名] order by [打卡时间] desc,这句就可以做到,让数据按照姓名分组,并且在每组内部按照时间进行排序

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值