惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

博客园 - Leetle

win2000/xp/2003下完全卸载ORACLE Oracle9i中分区partition的使用 [ZT]Oracle数据库字符集问题解决方案大全 Oracle 8.1.6 for Win2000 系统文件解释 如何连接oracle数据库及故障解决办法 Oracle 9i初始化参数文件 简单冷备份恢复操作步骤 Win 下常用的oracle 9i服务的介绍 oracle初始化参数说明 Oracle中的数据字典技术初级入门 【转帖】揭露不为人所知的招聘网站的秘密, 业内人士告诉你:为何你的简历石沉大海?! 市场盈亏指标CYS的使用技巧 炒股短线招术(完整版) DBA常用SQL语句系列 Function怎么返回一个数据集 Oracle 9i 分析函数参考手册 oracle日期处理完全版(三) oracle日期处理完全版(二) oracle日期处理完全版(一)
使用Oracle的分析函数ROW_NUMBER、DENSE_RANK、RANK
Leetle · 2007-04-09 · via 博客园 - Leetle

这三个分析函数都可以在各个分组内从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

9 rows selected.