`
lishumingwm163.com
  • 浏览: 338995 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Oracle RANK和dense_rank的使用

 
阅读更多

  在9i版本之前,只有分析功能(analytic ),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。
  
  其语法为:
  
  RANK ( ) OVER ( [query_partition_clause] order_by_clause )
  
  在9i版本新增加了合计功能(aggregate),即对给定的参数值在设定的排序查询中计算出其排序值。这些参数必须是常数或常值表达式,且必须和ORDER BY子句中的字段个数、位置、类型完全一致。
  
  其语法为:
  
  RANK ( expr [, expr]... ) WITHIN GROUP
  ( ORDER BY
  expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
  [, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
  )
  
  例子1:
  
  有表Table内容如下
  
  COL1 COL2
    1 1
    2 1
    3 2
    3 1
    4 1
    4 2
    5 2
    5 2
    6 2
  
  分析功能:列出Col2分组后根据Col1排序,并生成数字列。比较实用于在成绩表中查出各科前几名的信息。
  
  SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM table a;
  
  结果如下:
  
  COL1 COL2 Rank
    1 1   1
    2 1   2
    3 1   3
    4 1   4
    3 2   1
    4 2   2
    5 2   3
    5 2   3
    6 2   5
  
  例子2:
  
  TABLE:A (科目,分数)
  
  数学,80
  语文,70
  数学,90
  数学,60
  数学,100
  语文,88
  语文,65
  语文,77
  
  现在我想要的结果是:(即想要每门科目的前3名的分数

  数学,100
  数学,90
  数学,80
  语文,88
  语文,77
  语文,70
  
  那么语句就这么写:
  
  select * from (select rank() over(partition by 科目 order by 分数 desc) rk,a.* from a) t
  where t.rk<=3;
  
  例子3:
  
  合计功能:计算出数值(4,1)在Orade By Col1,Col2排序下的排序值,也就是col1=4,col2=1在排序以后的位置
  
  SELECT RANK(4,3) WITHIN GROUP (ORDER BY col1,col2) "Rank" FROM table;
  
  结果如下:
  Rank
  4
  
  dense_rank与rank()用法相当,但是有一个区别:dence_rank在并列关系是,相关等级不会跳过。rank则跳过
  
  例如:表
  
  A      B      C
  a     liu     wang
  a     jin     shu
  a     cai     kai
  b     yang     du
  b     lin     ying
  b     yao     cai
  b     yang     99
  
  例如:当rank时为:
  
  select m.a,m.b,m.c,rank() over(partition by a order by b) liu from test3 m
  
   A     B       C     LIU
   a     cai      kai     1
   a     jin      shu     2
   a     liu      wang     3
   b     lin      ying     1
   b     yang     du      2
   b     yang     99      2
   b     yao      cai     4
  
  而如果用dense_rank时为:
  
  select m.a,m.b,m.c,dense_rank() over(partition by a order by b) liu from test3 m
  
   A     B       C     LIU
   a     cai     kai     1
   a     jin     shu     2
   a     liu     wang     3
   b     lin     ying     1
   b     yang     du      2
   b     yang     99      2
   b     yao     cai     3
分享到:
评论

相关推荐

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

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

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

    RANK、DENSE_RANK和ROW_NUMBER提供行号,GROUP BY用于对数据进行分组,ORDER BY则对结果进行排序。 这些只是Oracle函数中的一部分,实际的Oracle函数大全包含的远不止这些。通过这份"oracle函数大全(分类显示).chm...

    oracle排名函数的使用方法分享

    在oracle中,有rank,dense_rank,row_number,以及分组排名partition。 说明: rank:排名会出现并列第n名,它之后的会跳过空出的名次,例如:1,2,2,4 dense_rank:排名会出现并列第n名,它之后的名次为n+1,例如:1,2,...

    ORACLE 常用分析函数

    分析函数2(Rank, Dense_rank, row_number);分析函数3(Top/Bottom N、First/Last、NTile);窗口函数;报表函数;分析函数总结;26个分析函数;PLSQL开发笔记和小结;分析函数简述  ROW_NUMBER () OVER([partition_clause]...

    oracle_排列rank()函数

    `RANK()`函数是Oracle数据库中一个强大的工具,能够有效地在一组数据中进行排名操作,尤其是在需要对数据进行分区和排序的情况下。通过理解`RANK()`函数的特性和与其他窗口函数的差异,数据分析师和数据库管理员可以...

    oracle分组排序统计高级用法

    - **示例**: 同上,我们使用`DENSE_RANK()`函数来找出每个学科的前三名成绩。 ```sql SELECT name, subject, score, DENSE_RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS rank FROM students ...

    oracle ranking function.doc

    此查询将返回每个产品类型的总销售额、RANK()、DENSE_RANK()、PERCENT_RANK()、CUME_DIST() 和 NTILE(3) 的值。通过比较这些排名和分布函数的结果,我们可以更全面地了解销售额的分布情况,如哪些产品类型的销售额...

    Oracle分析函数使用总结

    注意到,当`SUM(AMOUNT)`的值为空时,RANK()和DENSE_RANK()默认将其视为最高排名1(在递减排序中),或者最低排名(在递增排序中)。 如果`SUM(AMOUNT)`中有相同的值,RANK()与DENSE_RANK()的差异就显现出来,前者...

    Oracle分析函数使用的总结.doc

    本文将详细介绍Oracle分析函数中的评级函数,包括RANK()、DENSE_RANK()、CUME_DIST()、PERCENT_RANK()和NTILE(),并结合示例进行解析。 1. RANK()函数: RANK()函数返回每个行在指定排序下的排名。如果两个或更多...

    oracle分析函数over_及开窗函数.txt

    本文将详细介绍Oracle中的`OVER`子句以及几种常用的开窗函数,包括`ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`和`LAG()`等。 #### 二、基本概念 - **`OVER`子句**:`OVER`子句用于指定分析函数的作用范围,它可以...

    oracle row_number用法

    SELECT DEPTNO, SAL, RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL) AS RANK_ORDER FROM SCOTT.EMP ORDER BY DEPTNO; ``` 结果如下: | DEPTNO | SAL | RANK_ORDER | |--------|-------|------------| ...

    Oracle_审计表_sys.aud$_授权给用户Truncate权限.docx

    DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) RANK_ORDER FROM GV$ACTIVE_SESSION_HISTORY ASH WHERE ASH.SESSION_TYPE &lt;&gt; 'BACKGROUND' AND ASH.SESSION_STATE = 'ONCPU' AND SAMPLE_TIME &gt; SYSDATE - 1/(24*...

    Oracle查询中OVER (PARTITION BY ..)用法

    在这个场景中,我们将深入探讨`RANK()`和`DENSE_RANK()`以及`MIN()`和`MAX()`在`OVER (PARTITION BY ..)`中的应用。 首先,让我们来看`RANK()`和`DENSE_RANK()`。这两种函数都是用来对分区内的数据进行排名,但是...

    oracle的分析函数汇总

    例如,可以使用 Rollup 函数对数据进行分组和汇总,使用 Rank 函数对数据进行排名,使用 Lag 和 Lead 函数对数据进行延迟和前导操作,使用 Sum 和 Avg 函数对数据进行汇总和平均计算,使用 Ratio_to_Report 函数对...

    ORACLE_培训之_分析函数

    - **rank()**, **dense_rank()** 和 **row_number()**: 用于排序,分别返回唯一的排名、无间隙的排名和行号。 - **lag()** 和 **lead()**: 提供对当前行前一行或后一行的访问,常用于时间序列分析。 - **rollup()** ...

    Oracle_adv.zip_Oracle進階_oracle

    6. **SQL Profile和Plan Baseline**:使用Oracle的自动性能优化功能,建立SQL执行计划的基线,改善执行效率。 通过以上知识点的学习和实践,你将能够更好地掌握Oracle 10g的高级特性,从而提升数据库管理和开发的...

    ORACLE分析函数.pdf

    Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它允许用户在单个查询中对数据进行聚合和分组分析,而无需使用子查询或复杂的存储过程。这些函数为数据分析提供了强大的工具,使得处理大量数据变得更加...

Global site tag (gtag.js) - Google Analytics