`
一笑_奈何
  • 浏览: 68251 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

oracle的几个排序函数 ROW_NUMBER()/DENSE_RANK()/RANK()

阅读更多
今天看到有位同事的sql中使用了“RANK() over partition BY order by  ”的语句,以前自己没使用过,

将百度结果也一并保存下来以备忘。



sql 原文:

SELECT *
  FROM
  (SELECT BC.SECUCODE 债券代码,
               BC.CHINAME 债券名称,
               TO_CHAR(BC.LISTEDDATE, 'yyyy-mm-dd') 债券上市日期,
               BC.ISSUER 发行人,
               RANK() over(partition BY BC.ISSUER order by BC.LISTEDDATE DESC) RANK_NO
      FROM
      (SELECT DISTINCT JBC.MAINCODE,
                    JBC.CHINAME,
                    JBC.ISSUER,
                    JBC.SECUCODE SECUCODE,
                    JBC.LISTEDDATE LISTEDDATE
            FROM ABC.BOND_CODE JBC
            WHERE TRIM(JBC.ISSUER) NOT IN
                 (SELECT DISTINCT TRIM(JLS.CHINAME)
                    FROM JUYUAN.LC_STOCKARCHIVES JLS)
      ) BC
   )
WHERE rank_no <= 3







百度查询资料:



oracle的几个排序函数



ref url:http://blog.csdn.net/lky5387/archive/2009/12/09/4972512.aspx



rank 根据order by排名 会出现并列排名。下一个值会跳过并列值 比如 1 2 2 4 5
通常对应rank还有 desc_rank 出现并列排名以后,下一个值不跳过并列值 1 2 2 3 4
row_number 就是直接排出一个名次。不会出现并列排名 1 2 3 4 5


这三个分析函数都可以在各个分组内从1开始排序。
ROW_NUMBER()是没有重复值的,可以利用它实现分页显示。


DENSE_RANK()是连续排序,有两个第二名时仍然跟着第三名。


RANK()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)。




SELECT * FROM (
     SELECT deptno, ename, sal, ROW_NUMBER()
     OVER (
       PARTITION BY deptno ORDER BY sal DESC
     ) Top3 FROM emp
)
WHERE Top3 <= 3
/

    DEPTNO ENAME                SAL          TOP3
---------- ---------- ---------- ----------
           10 KING                   5000             1
           10 CLARK               2450             2
           10 MILLER              1300             3

           20 SCOTT               3000             1
           20 FORD                 3000             2
           20 JONES                2975             3

           30 BLAKE               2850             1
           30 ALLEN               1600             2
           30 TURNER            1500             3

9 rows selected.



SELECT * FROM (
     SELECT deptno, ename, sal, DENSE_RANK()
     OVER (
       PARTITION BY deptno ORDER BY sal DESC
     ) TopN FROM emp
)
WHERE TopN <= 3
ORDER BY deptno, sal DESC
/

       DEPTNO ENAME                SAL          TOPN
---------- ---------- ---------- ----------
           10 KING                  5000             1
           10 CLARK               2450             2
           10 MILLER              1300             3

          20 SCOTT               3000             1     <--- !
          20 FORD                3000             1     <--- !
           20 JONES               2975             2
           20 ADAMS              1100             3

           30 BLAKE               2850             1
           30 ALLEN               1600             2
           30 TURNER            1500             3


10 rows selected.



SELECT * FROM (
     SELECT deptno, ename, sal, RANK()
     OVER (
       PARTITION BY deptno ORDER BY sal DESC
     ) TopN FROM emp
)
WHERE TopN <= 3
ORDER BY deptno, sal DESC
/

       DEPTNO ENAME                SAL          TOPN
---------- ---------- ---------- ----------
           10 KING                   5000             1
           10 CLARK               2450             2
           10 MILLER              1300             3

          20 SCOTT               3000            1     <--- !
          20 FORD                 3000           1     <--- !
           20 JONES               2975            3

           30 BLAKE               2850             1
           30 ALLEN               1600             2
           30 TURNER            1500             3
分享到:
评论

相关推荐

    oracle row_number用法

    `ROW_NUMBER()`函数是Oracle数据库中一个非常强大的工具,特别是在需要对数据进行分组和排序时。通过掌握其基本用法以及与其他窗口函数的结合使用,可以在数据处理和分析方面发挥重要作用。无论是简单的排序还是复杂...

    Oracle开发之分析函数(Rank, Dense_rank, row_number)

    Oracle分析函数Rank、Dense_rank和row_number是用于处理数据集的高级工具,它们在数据库查询中发挥着关键作用,特别是在需要对数据进行排序和分组时。这三种函数都有各自的特点,适用于不同的业务场景。 1. **row_...

    深入探讨:oracle中row_number() over()分析函数用法

    Oracle数据库中的`row_number() over()`分析函数是一个非常实用的工具,用于为数据集中的每一行分配一个唯一的整数,这个数字基于指定的排序条件。在处理大数据集时,它可以帮助我们进行分页、排名或者在复杂的查询...

    ORACLE 常用分析函数

     ROW_NUMBER () OVER([partition_clause] order_by_clause) dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值所在行的序列值相同,但其后的序列值从...

    oracle函数大全(分类显示).zip_Oracle 函数分类_oracle_oracle函数分类_oracle函数查阅用文档

    RANK、DENSE_RANK、ROW_NUMBER、GROUP BY、ORDER BY,用于数据的排序和分组。RANK、DENSE_RANK和ROW_NUMBER提供行号,GROUP BY用于对数据进行分组,ORDER BY则对结果进行排序。 这些只是Oracle函数中的一部分,...

    Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

    在上述信息中,提到了几个关键的分析函数:RANK()、ROW_NUMBER()和LAG(),下面将详细阐述这些函数的使用方法和特点。 1. **ROW_NUMBER()** ROW_NUMBER()函数用于为每个分组内的行分配一个唯一的序列号,这个编号是...

    Oracle分析函数

    DENSE_RANK 函数用于计算行的相对排序,相同的值具有一样的序数。 3.8 FIRST_VALUE 函数 FIRST_VALUE 函数用于获取一个组的第一个值。 3.9 LAG 函数 LAG 函数用于访问之前的行。 3.10 LAST_VALUE 函数 LAST_...

    oracle分析函数

    - **rank()** 和 **dense_rank()**:与 `row_number()` 类似,但当遇到相同排序值时,`rank()` 会跳过一些行号,而 `dense_rank()` 不会。 #### 拓展应用 - **数据排名**:可以使用 `row_number()` 来确定数据集中...

    oracle_排列rank()函数

    `ROW_NUMBER()`函数为每个分区内的行分配一个连续的编号,即使有多个行具有相同的排序值,每个行也会获得不同的编号。因此,`ROW_NUMBER()`在所有情况下都提供了一个连续的数字序列,没有重复或跳过。 ### 实际应用...

    oracle 的几个分析函数

    ROW_NUMBER()函数为每一行分配一个唯一的整数,通常用于排序后的结果集。这个数字从1开始递增,对于每个新的分组或排序顺序,数字会重新开始。例如,以下SQL语句将返回每个部门员工的编号: ```sql SELECT ...

    oracle分组排序统计高级用法

    - 分析函数包括`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()`、`LEAD()`、`LAG()`等。 - `OVER`子句可以包括`PARTITION BY`、`ORDER BY`和`ROWS`或`RANGE`之间的范围。 **2. `ROW_NUMBER()`、`RANK()`、`DENSE_RANK...

    Oracle内建函数大全

    - RANK/DENSE_RANK/ROW_NUMBER:为每组内的行提供唯一的排名。 - ORDER BY:对查询结果进行排序。 8. **连接查询相关函数** - JOIN:连接两个或更多表以检索数据。 - UNION/UNION ALL:合并来自多个SELECT语句...

    Oracle分析函数参考手册

    除了AVG和CORR,Oracle还提供了其他分析函数,如LEAD/LAG(获取当前行的前/后一行数据)、RANK/DENSE_RANK/ROW_NUMBER(为每一行分配唯一的排名)、PERCENT_RANK/CUME_DIST(计算百分位或累积分布)、MIN/MAX(按...

    oracle常用分析函数与聚合函数的用法

    3. **Row_Number()**:这个函数为每个分组内的行分配一个唯一的数字,根据指定的排序规则(如果有partition by,会在每个分区内部进行排序)。 下面是一个示例,展示了这三个函数如何应用于数据: ```sql with lcy...

    oracle统计函数.pdf

    本次介绍的是几个常用的Oracle统计函数:row_number()、rank()和dense_rank()。 首先,row_number()函数会为查询结果集中的每一行分配一个唯一的连续整数序列号。这个数字是根据ORDER BY子句中定义的顺序进行排序的...

    ORACLE分析函数

    根据提供的文件信息,我们可以深入探讨Oracle分析函数的相关知识点,特别是`SUM()`函数配合`OVER`子句的不同用法,以及`RANK()`, `DENSE_RANK()`, 和 `ROW_NUMBER()` 这三个窗口函数的应用场景。 ### Oracle分析...

Global site tag (gtag.js) - Google Analytics