sqlserver 开窗函数over RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同
来源:互联网 发布:有没有手机版的php手册 编辑:程序博客网 时间:2024/05/18 12:44
一、开窗函数over()
开窗函数适用于在每一行的最后一列添加聚合函数的结果。
常用开窗函数:
1.为每条数据显示聚合信息.(聚合函数() over())
2.为每条数据提供分组的聚合函数结果(聚合函数() over(partition by 字段) as 别名) --按照字段分组,分组后进行计算
3.与排名函数一起使用(row number() over(order by 字段) as 别名)
常用分析函数:(最常用的应该是1.2.3 的排序)
1、row_number() over(partition by ... order by ...)
2、rank() over(partition by ... order by ...)
3、dense_rank() over(partition by ... order by ...)
4、count() over(partition by ... order by ...)
5、max() over(partition by ... order by ...)
6、min() over(partition by ... order by ...)
7、sum() over(partition by ... order by ...)
8、avg() over(partition by ... order by ...)
9、first_value() over(partition by ... order by ...)
10、last_value() over(partition by ... order by ...)
11、lag() over(partition by ... order by ...)
12、lead() over(partition by ... order by ...)
lag 和lead 可以 获取结果集中,按一定排序所排列的当前行的上下相邻若干offset 的某个行的某个列(不用结果集的自关联);
lag ,lead 分别是向前,向后;
lag 和lead 有三个参数,第一个参数是列名,第二个参数是偏移的offset,第三个参数是 超出记录窗口时的默认值)
CREATE TABLE STU(
id INT IDENTITY,
name VARCHAR(50),
score INT,
subject VARCHAR(50)
)
INSERT INTO bi.dbo.STU
( name, score,subject)
VALUES
( 'tom', 20,'数学'),
('jerry',60,'英语'),
('bob',30,'语文'),
('marry',30,'语文'),
('lucy',60,'物理'),
('bob',90,'英语'),
('tom',50,'英语'),
('jerry',50,'物理')
SELECT *,AVG(score) over(PARTITION BY name (ORDER BY id)) FROM bi.dbo.STU 结果为:
tips:1、如果为每条数据提供分组的聚合函数结果(聚合函数() over(partition by 字段) as 别名),就不要加order by ,
会导致每个分组的最后一行才有聚合结果
2、与排名函数一起使用(row number() over(order by 字段) as 别名),加order by
和group by的区别,
SELECT *,AVG(score) over(PARTITION BY name ) FROM bi.dbo.STU;select后面可以加未分组的字段,因为over把聚合结果变成多行
SELECT *, SUM(score) OVER () FROM bi.dbo.STU group by name 会报错,因为sum(score)是一行,而*是多行
在分页中的运用
用over()
二、RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同
SELECT
s.deptno,s.ename,s.sal,
RANK() over(partition by s.deptno order by s.sal) as rank,
DENSE_RANK() over(partition by s.deptno order by s.sal) as dense_rank,
ROW_NUMBER() over(partition by s.deptno order by s.sal) as row_number
FROM emp s;
这是一个查询每个部门员工工资的排序情况
从查询结果中很明显的发现规律:
RANK() 发生不持续的编号 例如数据值 1,2,2,3 发生的编号将是1,2,2,4
DENSE_RANK() 发生持续的编号 例如数据值 1,2,2,3 发生的编号将是1,2,2,3
ROW_NUMBER() 发生持续的编号(不重复) 例如数据值 1,2,2,3 发生的编号将是1,2,3,4
- sqlserver 开窗函数over RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同
- rank() over,dense_rank() over,row_number() over函数的区别
- SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
- SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
- 开窗函数详解(rank()、dense_rank()、row_number())
- 一个SQL语句分清楚RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同
- 一个SQL语句分清楚RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同
- SQL中ROW_NUMBER()/RANK() /DENSE_RANK() OVER函数的基本用法
- ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD OVER()函数
- sql 排名函数 rank() , row_number() , dense_rank() over
- oracle 分组函数rank() over(),dense_rank(),row_number()
- SQLServer 2005 实现排序报表的利器 排序函数RANK()、DENSE_RANK()、NTILE()和ROW_NUMBER()
- SQLServer 2005 实现排序报表的利器 排序函数RANK()、DENSE_RANK()、NTILE()和ROW_NUMBER()
- dense_rank() over()、rank() over()、row_number() over分析函数
- dense_rank() over()、rank() over()、row_number() over分析函数
- SqlServer 排名函数(row_number、rank、dense_rank)的比较
- SqlServer 排名函数(row_number、rank、dense_rank)的比较
- SQLSERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER
- Android
- HTML5 和 CSS3
- 第十六周(Longest Substring )
- 《javascript权威指南》学习笔记数组对象
- android kotlin类和对象(三)-对象
- sqlserver 开窗函数over RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同
- Bootstrap 模态框(Modal)使用
- Unity 3D鼠标操作实现旋转、缩放观察物体
- HTML 的语义化理解
- ckplayer播放器设置默认封面时部分浏览器不能正常显示封面图片问题的处理
- json数据转化
- ES6 (十) Set 和 Map
- 系统分析与设计--学习笔记3(用例建模)
- 20170605_unordered_map和unordered_set的具体使用案例