`

转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()

阅读更多

原文转载自:http://blog.csdn.net/a5685263/article/details/52187070

 

以下为转载内容:

首先,我们创建一些测试数据。

if OBJECT_ID('Tempdb.dbo.#Tmp') is not null
    drop table #Tmp
create table #Tmp
(
name nvarchar(10)
)

insert into #Tmp
select N'张三'
union
select N'李四'
union 
select N'王五'
union 
select N'赵六'
union
select N'朱七'
union
select N'王八'
union all
select N'张三'

PS:最后一个union用union all,因为我们多一行"张三"。

 

一、ROW_NUMBER() over(partition by columnname order by columnname)

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

可以得到按name排序的结果集。

ROW_NUMBER() over()还有一种用法,可以针对某列进行分组排序。

下面结果可以看到张三有1和2两个排序,而其他的名字排序都只有1。

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

结果:

 

二、RANK()over(order by columnname)
大家可以从下面的结果集看到,结果集少了5的编号,而有两个4的编号,然后直接跳到编号6。

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

结果:

  
三、DENSE_RANK()over(order by columnname)

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

执行Sql后发现,下面的结果集有2个编号4的行,紧接着就是编号5的行。

DENSE_RANK()函数和RANK()函数差不多。
RANK()函数不管分几组,最后的编号一定和行数相同。
DENSE_RANK()函数最后的编号和分组的数目有关。

 

四、NTILE()OVER(ORDER BY COLUMNNAME)

select NTILE(2)over(order by name),* from #Tmp
select NTILE(3)over(order by name),* from #Tmp

NTILE后面的数字,是要把查询得到的结果平均分为几组。
如下图分为2和3组。
如果行数平均划分后还有余行,那么就把行分在最前面的几组上。
比如我们的结果有7行,要分为3组。
那么第一组3行,第二组2行,第三组2行。
如果我们结果有14行,平均分为3组。
那么第一组5行,第二组5行,第三组4行。
依此类推。

 

 

  • 大小: 14.3 KB
  • 大小: 14.6 KB
  • 大小: 13 KB
  • 大小: 13.5 KB
  • 大小: 28.6 KB
分享到:
评论

相关推荐

    SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较

    rank函数与rank函数类似,同样考虑到了排序字段值相同的情况,但它的处理方式是连续分配序号,不会因为值的重复而跳过序号。还是以上述为例,当field1字段值相同时,dense_rank函数会连续分配序号,即后三条记录的...

    [sql server]SQL Server2005杂谈(3):四个排名函数的比较.doc

    SQL Server 2005 中提供了四个排名函数,分别是 row_number、rank、dense_rank 和 ntile。这四个函数的主要功能是为查询结果生成一个序号,用于实现查询指定范围的记录或实现分页功能。 一、row_number 函数 row_...

    SQL Server 2005 提供了4个行号排序函数

    本文将详细介绍这四个行号排序函数:`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()` 和 `NTILE()` 的用法和应用场景。 #### 二、ROW_NUMBER() `ROW_NUMBER()` 函数为分区中的每一行分配一个唯一的数字。该函数对于实现...

    Sql Server2005对t-sql的增强之排名函数

    排名函数主要包括ROW_NUMBER、RANK、DENSE_RANK以及NTILE,它们各自有着不同的应用场景和功能。 1. NTILE函数 NTILE函数用于将一个有序分区的行分配到指定数量的组中。每个组都有一个从1开始的编号。例如,如果...

    SQL-生成序号的四种方式1

    SQL Server 2005引入了四个排名函数,分别是`row_number`, `rank`, `dense_rank`, 和 `ntile`。这些函数帮助我们为查询结果集中的每一行赋予一个唯一的或基于特定条件的顺序编号。 1. `row_number()` `row_number...

    SQL Server 总结复习 (二)

    在SQL Server中,数据库操作和数据分析常常涉及到对数据的排序和排名,这正是`ROW_NUMBER()`,`RANK()`,`DENSE_RANK()`以及`NTILE()`等排名函数的用武之地。这些函数可以帮助我们更好地理解和处理数据集,特别是在...

    SQL Server 2005下T-SQL增强功能的研究和应用.pdf

    其中最显著的改进之一是引入了四个新的排名函数:ROW_NUMBER()、RANK()、DENSE_RANK()和NTILE()。这些函数极大地简化了排名计算的过程。 1. ROW_NUMBER()函数用于为每一行数据赋予一个唯一的序号,类似于Oracle中的...

    expert t_sql window functions in sql server

    在SQL Server中,T-SQL窗口函数是一种强大的工具,它允许开发者在一组相关行上执行计算,而不仅仅是当前行。这些函数在处理聚合、排序、分区数据时特别有用,为复杂的数据分析提供了便利。本主题将深入探讨T-SQL窗口...

    SqlServer 2005 T-SQL Query 学习笔记(2)

    这四个函数分别是ROW_NUMBER、RANK、DENSE_RANK和NTILE,它们都用于根据指定的排序标准为每一行赋予一个唯一的排名值。 1. ROW_NUMBER() 函数: ROW_NUMBER() 用于为数据集中的每一行分配一个唯一的连续数字,基于...

    SqlServer 2005的排名函数使用小结

    本篇文章主要总结了三种主要的排名函数:ROW_NUMBER、RANK和DENSE_RANK,以及 NTILE 函数的使用方法。 1. ROW_NUMBER() 函数: ROW_NUMBER() 用于为查询结果集中的每一行提供一个唯一的行号,这个行号是基于指定的...

    sql server如何利用开窗函数over()进行分组统计

    其中一种常见的是排名功能,例如`ROW_NUMBER()`, `DENSE_RANK()`, `RANK()`和`NTILE()`。这些函数可以为每组数据生成唯一的序列号,根据指定的`ORDER BY`条件进行排序。 - `ROW_NUMBER()`为每组的行生成一个从1开始...

    SQL开窗函数.zipSQL开窗函数.zipSQL开窗函数.zip

    - **RANK()、ROW_NUMBER()和DENSE_RANK()**:这三个函数用于为每个分区内的行分配唯一的序列号。RANK()和ROW_NUMBER()类似,但当有相同值时,RANK()会跳过序号;DENSE_RANK()则不会跳过,会连续编号。 - **LEAD()...

    Sql Server 开窗函数Over()的使用实例详解

    除了`ROW_NUMBER()`,还有`RANK()`、`DENSE_RANK()`和`NTILE()`这三个排名函数。它们的主要区别在于处理相同值时生成的序号是否连续。`RANK()`在遇到重复值后会跳过下一个序号,`DENSE_RANK()`则不会,而`NTILE()`则...

    SQL Server 2012 开窗函数

    SQL Server 2012 的开窗函数(Window Functions)是一种强大的分析工具,它允许你在结果集的基础上进行更复杂的计算,而无需通过子查询或自连接。这些函数可以在每个分组内或者整个数据集上执行聚合操作,同时保留...

    SQL开窗函数的基本概念、用法以及一些常见的开窗函数

    SELECT column1, column2, ROW_NUMBER() OVER (ORDER BY column1) AS row_num FROM table_name; ``` - **解释**: 上述查询将为`table_name`中的每一行分配一个递增的序号,根据`column1`的值进行排序。 ##### 2....

    SQL窗口函数速查表.pdf

    - **排名函数**:如`RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`,用于为每个分组内的行分配唯一的排名值。 - **聚合函数**:如`SUM()`, `AVG()`, `COUNT()`, `MIN()`, `MAX()`,但带有`OVER()`子句,使得它们可以在...

Global site tag (gtag.js) - Google Analytics