业务系统中常常会有排名的需求,考试和比赛中则更普遍了。Excel 中也有个 Rank 函数供排名之用,数据库中更不例外了。

如果须要找出工资最高的前三个员工工资(及其员工号)。

只是。“前三名”的详细含义须要准确的定义。不然查出来的可能不是想要的结果。

首先。由于表中记录数可能就少于三,查出来的记录可能等于三条也可能少于三条。其次,须要考虑并列名次的处理。

  1. 假设名次不能并列,则还须要考虑是否要依据工资之外的列来区分排名。

    比如:

         名次 ID 工资
    -------------
    1 80 1000
    2 90 1000
    3 13 900 取前三名,则“4 19 900”不会被输出。
  2. 假设名次能够并列,则还有两种不同方式。

    1)名次并列,可是兴许的名次要空出来。比如:

    名次 ID 工资
    -------------
    1 80 1000
    1 90 1000
    3 13 900

    2)兴许的名次不空出来。

    名次 ID 工资
    -------------
    1 80 1000
    1 90 1000
    2 13 900

在 Oracle 的演示样例数据库中。针对上述三种不同的情况能够通过不同的函数来实现。为了体现反复数据的影响,取了前5名。

  1. 用 ROW_NUMBER()。

    SQL> select * from (select salary, row_number() over (order by salary desc) as seq from hr.employees) where seq <= 5;
    
    	SALARY        SEQ
    ---------- ----------
    24000 1
    17000 2
    17000 3
    14000 4
    13500 5
  2. 用 RANK()。
    SQL> select * from (select salary, rank() over (order by salary desc) as seq from hr.employees) where seq <= 5;
    
    	SALARY        SEQ
    ---------- ----------
    24000 1
    17000 2
    17000 2
    14000 4
    13500 5
  3. 用 DENSE_RANK()。
    SQL> select * from (select salary, dense_rank() over (order by salary desc) as seq from hr.employees) where seq <= 5;
    
    	SALARY        SEQ
    ---------- ----------
    24000 1
    17000 2
    17000 2
    14000 3
    13500 4
    13000 5

第一种须要的结果相对简单一点,可是结果集有些特殊(工资同样的人可能仅仅有一部分被选择出来)。在不支持 RANK() 的系统中。能够通过 LIMIT 等方式变通实现:

select employee_id, salary from hr.employee order by salary desc limit 5;

假设连 LIMIT 也没有,仅仅同意採用最主要的 SQL 构造。则更麻烦和低效。

基本思路是等价转换须要的查询“查工资的前五名”。比如:“工资的第1名”等价于“工资大于他的人为0人”。“工资的前5名”等价于“工资大于他的人不超过4人”。

也能够转换为“找出全部工资大于等于工资排名第五的人”。不要忘了处理排名并列的情况。

SQL> select employee_id, salary from hr.employees o where (select count(distinct employee_id) from hr.employees where salary > o.salary) < 5 order by 2 desc, 1 desc;

EMPLOYEE_ID     SALARY
----------- ----------
100 24000
102 17000
101 17000
145 14000
146 13500

用SQL找出前N名的更多相关文章

  1. 排序练习——找出前m大的数字 分类: 排序 2015-06-08 09:33 21人阅读 评论(0) 收藏

    排序练习--找出前m大的数字 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定n个数字,找出前m大的数字.   输入  多组输 ...

  2. 海量数据中找出前k大数(topk问题)

    海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...

  3. [Oracle/SQL]找出id为0的科目考试成绩及格的学生名单的四种等效SQL语句

    本文是受网文 <一次非常有意思的SQL优化经历:从30248.271s到0.001s>启发而产生的. 网文没讲创建表的数据过程,我帮他给出. 创建科目表及数据: CREATE TABLE ...

  4. Java/sql找出oracle数据库有空格的列

    1.java方式 String table_sql = "select table_name from user_tables";//所有用户表 List<String> ...

  5. Oracle PL/SQL 找出100以内是3和5的倍数的数 循环语句

    循环: loop --执行代码 exit when 表达式;--当表达式为真退出循环.(注意,其编写位置决定循环为先判断还是先执行,相当于java的while或do-while) end loop; ...

  6. SQL——找出某一字段中内容相同的数据

    SELECT columnName from dbo.tableName group by columnName having count(*)>1

  7. sql 找出不包含字母、不包含汉字的数据

    --1.不包含字母 SELECT * FROM t WHERE str NOT LIKE '%[a-zA-Z]%' SELECT * FROM t --2.不包含汉字 SELECT * FROM t ...

  8. 找出数组前N大的数

    这个题也是个比较有名的面试题.当然有很多变种. 题目意思基本是:从一个数据量很大的数组里找前N大的元素.不允许排序. 这个题有两个比较好的思路: 思路一:用快速排序的思想,是思想,不是要排序; 思路二 ...

  9. 从一亿个ip找出出现次数最多的IP(分治法)

    /* 1,hash散列 2,找到每个块出现次数最多的(默认出现均匀)—–>可以用字典树 3,在每个块出现最多的数据中挑选出最大的为结果 */ 问题一: 怎么在海量数据中找出重复次数最多的一个 算 ...

随机推荐

  1. 关于bcg库记忆界面的问题及其解决办法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天同事向我请教一个问题,说他使用BCG创建了一个停靠栏,之后把代码注释了,但是程序启动时总出现一个Debug Ass ...

  2. Java学习笔记八

    IO流:就是input/output输入/输出流. 一.字节流操作文件的便捷类:FileWriter和FileReader import java.io.FileWriter; import java ...

  3. HTML5手机应用的最大优势就是可以在网页上直接调试和修改

    HTML5手机应用的最大优势就是可以在网页上直接调试和修改

  4. 《二》Java IO 流的分类介绍

    一.根据流向分为输入流和输出流: 注意输入流和输出流是相对于程序而言的. 输出:把程序(内存)中的内容输出到磁盘.光盘等存储设备中        输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序 ...

  5. easyui树查找

    前端查询 /* 树查询*/ function searchMaterial(){ var parentNode=$('#selectMaterialTree').tree('getRoots'); / ...

  6. 关于Webpack详述系列文章 (第一篇)

    WebPack官网地址(https://webpack-china.org/) 1. 什么是WebPack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript ...

  7. 【2017 Multi-University Training Contest - Team 9】Numbers

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6168 [题意] 有一个长度为n的序列a1--an,根据a序列生成了一个b序列,b[i] = a[i]+a ...

  8. [MySQL 5.1 体验]MySQL 实例管理器 mysqlmanager 初试

    原贴:http://imysql.cn/node/313 [MySQL 5.1 体验]MySQL 实例管理器 mysqlmanager 初试 周二, 2007/06/19 - 22:10 - yejr ...

  9. 国内计算机类期刊 SCI收录:

    国内计算机类期刊 SCI收录: JOURNAL OF COMPUTER SCIENCE AND TECHNOLOGY,计算机科学与技术,英文,双月刊, SCIE 国内计算机类期刊 EI收录: 核心类 ...

  10. Day1:第一个python小程序

    Day1:第一个python小程序与开发工具Pycharm 一.Hello World C:\Users\wenxh>python Python 3.6.2 (v3.6.2:5fd33b5, J ...