坐地铁回家路上忽然想起,三甲排名可能为多个,只取三名岂不荒谬。不信请看下面数据:

create table tb_score(
id number(4,0) primary key,
name nvarchar2(20) not null,
score integer not null) insert into tb_score values('','Andy','');
insert into tb_score values('','Bill','');
insert into tb_score values('','Cindy','');
insert into tb_score values('','Douglas','');
insert into tb_score values('','Eliot','');
insert into tb_score values('','Flex','');
insert into tb_score values('','Hellen','');
insert into tb_score values('','jack','');
insert into tb_score values('','king','');
insert into tb_score values('','tim','');
insert into tb_score values('','yang','');

明显100分的状元有Andy,Cindy两人,99分的榜眼也有两人,98分的探花有三人。

正确的做法是按分数分组,名字累加,再取分数最高的三个等级,SQL如下:

select b.* from
(
select a.*,rownum as rn from
(
select listagg(name,',') within group (order by name) as names from tb_score
group by score
order by score desc
) a
) b
where b.rn<4

数据如下:

SQL> select b.* from
2 (
3 select a.*,rownum as rn from
4 (
5 select listagg(name,',') within group (order by name) as names from tb_score
6 group by score
7 order by score desc
8 ) a
9 ) b
10 where b.rn<4; NAMES RN
-------------------------------- ----------
A n d y, C i n d y 1
B i l l, D o u g l a s 2
E l i o t, F l e x, H e l l e n 3

这才是公平公正和稳妥的排名。

--2020年4月23日--

Oracle中真正稳妥的求三甲的方法的更多相关文章

  1. Oracle中获取执行计划的几种方法分析

    以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下     1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条S ...

  2. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  3. Oracle中的SQL分页查询原理和方法详解

    Oracle中的SQL分页查询原理和方法详解 分析得不错! http://blog.csdn.net/anxpp/article/details/51534006

  4. Oracle中查询当前时间、时间格式化方法

    Oracle中如何获取系统当前时间 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;  ORACLE里获取一个时间的年.季.月.周. ...

  5. Oracle中spool命令实现的两种方法比较

    ---恢复内容开始--- 要输出符合要求格式的数据文件只需在select时用字符连接来规范格式.比如有如下表 SQL>; select id,username,password from myu ...

  6. Oracle中新建数据表的两种方法

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  7. Oracle中备份用户对象的两种方法

    方法1: 执行步骤: exp userid=用户名/密码@数据库名 file=c:\emp.dmp 使用当前用户导出 exp userid=sys/sys@数据库名 file=c:\emp.dmp o ...

  8. oracle中LPAD和RPAD函数的使用方法(加个人总结)

    今天看到两个没有见过的SQL中的函数,总结一下: 函数参数:lpad( string1, padded_length, [ pad_string ] ) 其中 string1:源字符串 padded_ ...

  9. oracle中清空表数据的两种方法

    1.delete from t 2 .truncate table t 区别: 1.delete是dml操作:truncate是ddl操作,ddl隐式提交不能回滚 2.delete from t可以回 ...

随机推荐

  1. 8、Builder 建造者模式 组装复杂的实例 创造型模式

    1.什么是Builder模式 定义: 将一个复杂对象的构建与表示相分离,使得同样的构建过程可以创建不同的表示.大白话就是,你不需要知道这个类的内部是什么样的,只用把想使用的参数传进去就可以了,达到了解 ...

  2. 17、Java 三大特性之 多态

    知识点:多态的概念.java中多态的使用(方法重载和重写.子类对象的多态性) .多态使用的好处 1.什么是多态? 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程 ...

  3. adb-使用

    1.打印日志 adb logcat -v time > logname.txt adb logcat -v > logname.txt 2.删除手机缓存日志 adb logcat -c 3 ...

  4. MySQL数据库——查询数据

    增加数据: insert into "表名" values( '字段'',字段'); 或insert into '表名'( '字段'',字段')  values( '字段'',字段 ...

  5. java 接口一

    一 接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口 的子类)来完成.这样将功能的 ...

  6. 认识与学习BASH①——鸟叔的Linux私房菜

    文章目录 认识与学习BASH① 认识BASH 壳程序 多种shells Bash shell 的功能 type :查询指令是否为Bash shell 的内置指令 指令的换行输入和快速删除 Shell的 ...

  7. Homekit_DoHome_智能通断器

    本款通断器适用于IOS和android系统用户,苹果用户可以非常方便的使用siri进行有效控制,android用户需要下载Dohome App进行操作,同时支持市面上主流的智能音箱进行控制. 对于an ...

  8. 简单认识Adam优化器

    转载地址 https://www.jianshu.com/p/aebcaf8af76e 基于随机梯度下降(SGD)的优化算法在科研和工程的很多领域里都是极其核心的.很多理论或工程问题都可以转化为对目标 ...

  9. DES算法的python3实现

    DES原理 DES原理 这里不予以复述, 有很多优秀的博客 原理可以参考这篇博客 https://www.cnblogs.com/songwenlong/p/5944139.html DES实现 1. ...

  10. 这样Review代码牛逼啦!

    这样Review代码牛逼啦! 一个对项目负责的团队代码质量检查是必不可少的,有条件的团队经常有代码review习惯,这样可以使技术团队共同进步,但是一个庞大的工程做代码review其实是很麻烦的,所以 ...