玖叶教程网

前端编程开发入门

SQLSERVER的四种排序函数(sqlserver排序查询)

先创建一个临时表进行效果展示

IF OBJECT_ID('Tempdb.dbo.#Tmp') IS NOT NULL 
    DROP TABLE #Tmp
CREATE TABLE #Tmp ( name NVARCHAR(10) )

INSERT  INTO #Tmp
        SELECT  N'赵一' 姓名
        UNION ALL
        SELECT  N'钱二'
        UNION ALL
        SELECT  N'孙三'
        UNION ALL
        SELECT  N'李四'
        UNION ALL
        SELECT  N'周五'
        UNION ALL
        SELECT  N'周五'
        UNION ALL
        SELECT  N'张六'
        UNION ALL
        SELECT  N'张六'

SELECT  * FROM  #Tmp

一、ROW_NUMBER

ROW_NUMBER()有2种用法,一种是给每行产生一个唯一的排序号,还有一种可以针对某列进行分组排序。

1、进行一般排序,产生一个序列号,sql如下:

select ROW_NUMBER() over (order by name) as num,* from #Tmp

2、根据name进行分组排序,sql语句如下:

select ROW_NUMBER() OVER (partition by name order by name) as num,* from #Tmp

二、RANK

rank函数就是对查询出来的记录进行排名,rank函数考虑了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个。

select RANK()over(order by name) num,* from #Tmp

效果如下:

三、DENSE_RANK

dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。

select DENSE_RANK() over (order by name) num,* from #Tmp

效果如下:

四、NTILE

将有序分区中的行分发到指定数目的组中。 各个组有编号,编号从一开始。 对于每一个行,NTILE 将返回此行所属的组的编号。

select NTILE(2)over(order by name) num,* from #Tmp
select NTILE(3)over(order by name) num,* from #Tmp
如下图分为2和3组。
如果行数平均划分后还有余行,那么就把行分在最前面的几组上。
比如我们的结果有8行,要分为3组。
那么第一组3行,第二组3行,第三组2行。
如果我们结果有7行,平均分为3组。
那么第一组3行,第二组2行,第三组2行。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言