首页 > 解决方案 > 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 的值。

标签: oraclenullsql-order-bydense-rank

解决方案


文档说:

使用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。


推荐阅读