oracle - DENSE_RANK ORDER BY NULL 总是返回 1
问题描述
我在 PROD 程序代码中发现:
select *
from (select "EMPNO",
"SAL",
"COMM",
"DEPTNO",
DENSE_RANK() OVER (PARTITION BY deptno ORDER BY null) AS drank
from SCOTT."EMP"
where deptno in (10,30))
where drank = 1
order by deptno
结果:
EMPNO SAL COMM DEPTNO DRANK
7934 1300 - 10 1
7839 5000 - 10 1
7782 2450 - 10 1
7844 1500 0 30 1
7900 950 - 30 1
7654 1250 1400 30 1
7499 1600 300 30 1
7698 2850 - 30 1
7521 1250 500 30 1
结果, drank总是等于 1。这也适用于:
DENSE_RANK() OVER (ORDER BY null) 喝了
DENSE_RANK() OVER (PARTITION BY comm ORDER BY null) 喝了
DENSE_RANK() OVER (PARTITION BY 1 ORDER BY null) 喝了
DENSE_RANK() OVER (PARTITION BY null ORDER BY null) 喝了
当有ORDER BY 空子句时,drank是否不等于 1 ?
编辑:我知道dense_rank从 1 开始。问题是关于大于 1 的值。
解决方案
文档说:
使用
order_by_clause
指定数据在分区内的排序方式。对于所有分析函数,您可以对分区中的多个键的值进行排序,每个键由 a 定义,每个键value_expr
由排序序列限定。在每个函数中,您可以指定多个排序表达式。这样做在使用对值进行排序的函数时特别有用,因为第二个表达式可以解决第一个表达式的相同值之间的关系。
每当
order_by_clause
多行的结果相同时,该函数的行为如下:
CUME_DIST
,DENSE_RANK
,NTILE
,PERCENT_RANK
, 并RANK
为每一行返回相同的结果。- ...
当您 时order by null
,多个所有行(在分区中)的order_by_clause
结果相同,因此它们都得到相同的结果。
的文档dense_rank
还说:
秩是从 1 开始的连续整数。
所以他们得到相同的结果,必须是 1。
推荐阅读
- python - 在无头火狐(Ubuntu)上使用 selenium 使用 python 下载文件
- swift - 当父节点和子节点各自具有 SKPhysicsBody 时出现问题
- html - 从 div 流到页面末尾的按钮宽度
- ethereum - 是否可以使用其存储但传递 msg.sender 以可靠的方式调用合约?
- reactjs - 如何渲染实际上是组件的道具?
- kotlin - 不可变集合被视为可变集合。无法使用 Collections.max
- c++ - 使用 2D 向量时出现分段错误
- r - 如何创建一个等于 R 数据框中另一列的前 5 个观察值的乘积的列?
- flutter - sudo gem install cocoapods 错误:无法构建 gem 原生扩展。?
- authentication - 授予 AWS 资源访问第三方应用程序的权限