SQL 的Over 子句
PARTITION BY
将查询结果集分为多个分区。 开窗函数分别应用于每个分区,并为每个分区重新启动计算。
<ORDER BY 子句>
定义结果集的每个分区中行的逻辑顺序。 也就是说,它指定按其执行开窗函数计算的逻辑顺序。
我创建了一个表,数据如下,
SQL> select * from test;
A1 A2
---------- ----------
1 3
2 4
3 2
3 5
4 2
然后用rank () over,
SQL> select a1,a2,rank () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 3
4 2 5
SQL> select a1,a2,rank () over (order by a2) rank from test;
A1 A2 RANK
---------- ---------- ----------
3 2 1
4 2 1
1 3 3
2 4 4
3 5 5
原来这个就是用来看排名的东东啊。
接下来看看row_number() over,
SQL> select a1,a2, row_number () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 4
4 2 5
SQL> select a1,a2, row_number () over (order by a2) rank from test;
A1 A2 RANK
---------- ---------- ----------
3 2 1
4 2 2
1 3 3
2 4 4
3 5 5
黄色标出了区别,这个很容易看清楚吧~~~
再看看dense_rank () over
SQL> select a1,a2, dense_rank () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 3
4 2 4
dense_rank在有出现相同的rank后,rank的值是紧接上一次的rank值。
可以这么理解,我们通常意义上的top N 的实现应该采用row_number() over 而不是rank () over,因为row_number 是给记录加一个序号标记,而rank 是相当于进行排序后的排名,也就是如果排序列是相同的,那么他们的返回值也是相同的,而row_number则不可能返回相同值。
放到一起看看吧:
SQL> select a1,a2,
2 rank () over (order by a1) rank,
3 dense_rank () over (order by a1) dense_rank,
4 row_number () over (order by a1) row_number
5 from test;
A1 A2 RANK DENSE_RANK ROW_NUMBER
---------- ---------- ---------- ---------- ----------
1 3 1 1 1
2 4 2 2 2
3 2 3 3 3
3 5 3 3 4
4 2 5 4 5
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的
SQL 的Over 子句相关推荐
- SQL基础---SQL ORDER BY 子句
SQL ORDER BY 子句 ORDER BY 语句用于对结果集进行排序. ORDER BY 语句 ORDER BY 语句用于根据指定的列对结果集进行排序. ORDER BY 语句默认按照升序对记录 ...
- SQL SELECT TOP 子句详解
SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目.语法如下 SELECT TOP number|percent column_name(s) FROM tabl ...
- SQL之with子句
with 语句 with 语句相当于建立了一张 临时虚拟表 即利用with子句为子查询的数据集作为一个内存临时表. 在内存中解析,提高执行效率.,并且提高SQL语句的可读性,用完即销毁. 语法 可以同 ...
- python定义字符串数组_从字符串数组(或元组)在Python中创建动态sql“ in list”子句的“最佳”方法是什么?...
我正在从Python(使用MySQLDb)运行一个动态MySQL查询,该查询包括一个包含字符串值的" in list"子句.执行此功能的函数将获取一个值数组.如果有帮助,我可以将该 ...
- SQL语句like子句中的转义符
如果想在SQL LIKE里查询有下划线'_'或是'%'等值的记录,直接写成like 'XXX_XX',则会把'_'当成是like的通配符.SQL里提供了 escape子句来处理这种情况,escape可 ...
- sql GROUP BY子句使用实例
GROUP BY子句 GROUP BY子句可以将表的行划分为不同的组.分别总结每个组,这样就可以控制想要看见的详细信息的级别. 语法: [ GROUP BY [ ALL ] group_by_expr ...
- SQL之COLLATE 子句 排序规则
COLLATE 是一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则转换. 语法 COLLATE { <collation_name> | databa ...
- 一次PHP中SQL的Where子句无效问题的解决之旅
文章目录 问题厘清 问题探索 应用的环境 代码分析 解决思路 总结 大概有五.六.七.八.九年没有使用PHP了, 这两天突然被一个跨站点的同仁问了一个PHP的问题,据描述这个问题已经折磨他三天了. 问 ...
- sql limit 子句_具有并行性SQL Server TOP子句性能问题
sql limit 子句 TOP操作员基础 ( Basics of TOP Operator ) The TOP keyword in SQL Server is a non-ANSI standar ...
最新文章
- 2022-2028年中国HDPE膜行业市场研究及投资发展分析报告
- linux驱动模块makefile,linux驱动makefile求解
- dfs入门排列数字问题(一看就懂的讲解)
- SSH下的组合批量增加
- php读取文件和读取redis,本地测试读取redis和普通文件缓存的速度,redis慢一倍?...
- AcWing 253. 普通平衡树
- mysql学习笔记-insert扩展
- stm32F4驱动AD7793程序-ADC模拟前端-应用详解,应该是最全了
- Linux 命令(11)—— col 命令
- dram和nand哪个难生产_终于有人说清楚了什么是DRAM、什么是NAND Flash
- android 自定义地图标注,Android高德地图自定义Markers【原创】
- 漫画:从今天开始,我不再买书了!
- django 模型choice基本讲解
- python批量读取图片并复制入word_提取出 Word 文档里的图片 并利用 python 批量转换格式...
- python神经网络识别验证码_基于卷积神经网络实现验证码识别(一)
- 爬虫python创意_爬虫案例:利用python爬虫关键词批量下载高清大图
- WebStrom中一些有趣的工具与常用快捷键
- 海南率先成为新能源汽车新零售第一战场
- XDM、GDM和KDM
- 如何才能成为数字IC后端ECO专家?
热门文章
- 在局域网访问_管理Windows访问凭证,快速访问局域网上的共享资源
- 数据库审计服务器性能要求,数据库审计技术指标资质要求-.docx
- python免安装环境 linux_python如何打包脚本(库也一起打包),直接在linux环境运行,不需要安装库?...
- java SAX 防xml注入,如何防止XML注入像XML Bomb和XXE攻击
- Java class.forname 功能介绍
- 计算机上机报告-origin,Origin 8上机练习1
- HDU3072(Kosaraju算法)
- Codeforces Round #686 (Div. 3) F. Array Partition(二分+线段树)
- 点分治问题 ----------- 2019西安邀请赛 j and and and[点分治]
- szu 寒训 day#3 ST表 和 LCA问题 附例题 菜鸡解法