SQLServer针对排名函数ROWNUMBER()、RANK()、DENSE_RANK()、NTILE的研究!~
相信大家在软件工程中经常会遇到对某些数据进行排名的问题,尤其是对于电子商务的HR来说“大手笔”是非常具有潜在价值的!~至于都有哪些价值这个超出本文的范畴不予进行说明,但是不得不说的是每一个精明的HR以下类似的需求:
我需要系统告诉我,截止到目前为止,近几个月内销售人员的订单交易数量排名、奖金排名(对内部员工员工)
我需要系统告诉我,截止到目前为止,商品热度的排名、购买力度的排名、充值力度的排名、提款力度的排名,相关地区的的排名(对客户)
对于SQL新人来说,第一个想到的函数TOP配合ROW_NUMBER()、ORDER BY,如果你用了这3个配合,那么恭喜你,You're Wrong!
因为上述的情况,可能会发生相同数据的排名,那么一旦排名的数据发生相同,因为ROWNUMBER()类似于IDENTITY(起始1,自增1)所以对排名的准确性就不那么明确了。
下面来看具体的例子:
基础数据准备:
/*以下代码执行完成只是为了讲解说明,执行完成需要刷新下IntelliSence缓存,更新下当前智能提示
*键盘快捷键 Ctrl+Shift+R。
*@author 系统管理员-咔咔
*@time 2013-11-25
*/
USE MyDB;
IF EXISTS (Select * From sys.objects Where name =N'EmployeOrdersCount' And Type In ('S','U'))
DROP TABLE EmployeOrdersCount
ELSE
CREATE TABLE EmployeOrdersCount --员工订单统计
(
Id INT PRIMARY KEY IDENTITY,--主键ID
EmployeNO NVARCHAR(15), --员工编号
OrdersCount INT, --订单数量
)
INSERT INTO EmployeOrdersCount(EmployeNO,OrdersCount)
VALUES('',100),('',100),('',100),('',100),
('',100),('',99),('',99),('',99),('',98),
('',98),('',97),('',96),('',100)
执行命令:
SELECT ROW_NUMBER() OVER(ORDER BY OrdersCount desc) AS 'RowNumber',
RANK() OVER(ORDER BY OrdersCount desc) AS 'Rank',
DENSE_RANK() OVER(ORDER BY OrdersCount desc) AS 'Dense_rank',
NTILE(4) OVER(ORDER BY OrdersCount desc) AS 'ntile'
,EmployeNO, OrdersCount
FROM EmployeOrdersCount
结果如下:
RowNumber Rank Dense_rank ntile EmployeNO OrdersCount
-------------------- -------------------- -------------------- -------------------- --------------- -----------
1 1 1 1 100 100
2 1 1 1 102 100
3 1 1 1 103 100
4 1 1 1 104 100
5 1 1 2 105 100
6 1 1 2 113 100
7 7 2 2 106 99
8 7 2 3 107 99
9 7 2 3 108 99
10 10 3 3 109 98
11 10 3 4 110 98
12 12 4 4 111 97
13 13 5 4 112 96 (13 行受影响)
结论如下:
ROWNUMBER():不关心行具有相同的值的问题,持续递增,类似于IDENTITY。
RANK():允许行具有相同的值的时候相同的排名,在遇到不同的值得时候重新进行ROWNUMBER()排名。
例如N个相同的值排名为1, 那么在N+1的时候排名采用ROWNUMBER()的值也就是N+.
DENSE_RANK():允许行具有相同的时候相同的排名,在遇到不同的值得时候采用上次的排名进行+1处理。
例如N个相同的值排名为1,那么在N+1的时候排名 采用上次的排名值也就是N+.
NTILE(X):这个函数可以说很少使用。几乎是个废柴,看上面的代码就明白了。
SQLServer针对排名函数ROWNUMBER()、RANK()、DENSE_RANK()、NTILE的研究!~的更多相关文章
- SQL Server中排名函数row_number,rank,dense_rank,ntile详解
SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...
- SQL Server:排名函数row_number,rank,dense_rank,ntile详解
1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...
- 开窗函数_ROW_NUMBER() / RANK() / DENSE_RANK() / NTILE() ------4个排名函数训练_1
排名函数(训练,其实从SQL2005时就已经被引入) /*SQL Server 2012从零开始学_7.8 排序函数*/ --DROP TABLE fruits GO Create table fr ...
- 好用的排名函数~ROW_NUMBER(),RANK(),DENSE_RANK() 三兄弟
排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用Partition By 的关键字,整个结果集进行排序) RANK 每个值一个排名,同样 ...
- Spark2 Dataset分析函数--排名函数row_number,rank,dense_rank,percent_rank
select gender, age, row_number() over(partition by gender order by age) as rowNumber, ...
- ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over() 今天女票问我SqlServer的四种排序,当场写了几句Sql让她了解,现把相关Sql放上来. 首先, ...
- SqlServer 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
CREATE TABLE [dbo].[Order]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserId] [int] NOT NULL, [TotalPrice] ...
- 知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法
回到目录 这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍. 一 row_number:它为数据表加一 ...
- SQL-OVER与四种排名函数:ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()
1 SELECT orderid,custid,val, ROW_NUMBER() OVER(ORDER BY val) AS rownum, RANK() OVER(ORDER BY val) AS ...
随机推荐
- iOS 从git拷贝Xcode的snippets
do following things in terminal 1. check out the project using: git clone gitAddress 2. cd the proje ...
- SOAPUI使用教程-MockOperations和响应
如前所述,一个MockService有多个MockOperations其中每个可以包含任意数量的MockResponse消息; 也就是说,一个MockService响应实际上包括若干预设响应之间发生变 ...
- bzoj 2753: [SCOI2012] 滑雪与时间胶囊 Label:MST
题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285 ...
- spring自定义schema学习
[转载请注明作者和原文链接,欢迎讨论,相互学习.] 一.前言 1. 最近在学习dubbo,里边很多如provider.consumer.registry的配置都是通过spring自定义Schema来实 ...
- MYSQL的常用命令和增删改查语句和数据类型【转】
连接命令:<a href="http://lib.csdn.net/base/mysql" class='replace_word' title="MySQL知识库 ...
- 转:ibatis的cacheModel
转:ibatis的cacheModel cachemodel是ibatis里面自带的缓存机制,正确的应用能很好提升我们系统的性能. 使用方法:在sqlmap的配置文件中加入 <cacheMode ...
- java分享第六天(冒泡排序)
冒泡排序 基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们 的排序与排序要求 ...
- PHP连接数据库的方法
mysql可通过两种方式通过PHP和web相连,一种通过php的mysql相关函数,另一种通过php的ODBC相关函数. 相关函数如下: MYSQL函数 mysql_affected_rows: 得到 ...
- SQL SERVER数据类型与C#数据类型对照表
SQL SERVER类型 C#类型 精确数字 bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数 ...
- win7下装完ubuntu linux后,开机画面怎直接进入linux了,win7怎么启动
修复 Windows 7 启动项重新启动ubuntu之后,结果发现选择windows 7的启动项,又进入到Ubuntu的安装界面.下面来说明如何修复,进人Ubuntu系统,打开“应用程序---附件-- ...