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

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. Docker 搭建 Keycloak

    Docker 搭建 Keycloak 命令 需要创建好数据库,启动容器指定数据库信息 # KEYCLOAK_USER 用户名 # KEYCLOAK_PASSWORD 密码 # DB_ADDR 数据库地 ...

  2. day25:魔术方法

    目录 1.__del__(析构方法) 2.魔术方法:__str__ 3.魔术方法:__repr__ 4.魔术方法:__call__ 5.魔术方法:__bool__ 6.魔术方法:__add__& ...

  3. 03-java实现循环链表

    03java实现循环链表 本人git https://github.com/bigeyes-debug/Algorithm 一丶单向循环链表 就是为尾节点指向头结点 二丶单向循环链表的接口设计 比较单 ...

  4. XCTF-WEB-新手练习区(5-8)笔记

    5:disabled_button X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢? 删除disable="" 字段 ...

  5. 【Java】AES加机解密工具类代码

    import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypt ...

  6. C#设计模式之19-观察者模式

    观察者模式(Observer Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/423 访问. 观察者模式 ...

  7. C#LeetCode刷题之#21-合并两个有序链表(Merge Two Sorted Lists)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3818 访问. 将两个有序链表合并为一个新的有序链表并返回.新链表 ...

  8. oracle正则表达式语法介绍及实现手机号码匹配方法

    Oracle10g提供了在查询中使用正则表达的功能,它是通过各种支持正则表达式的函数在where子句中实现的.本文将简单的介绍oracle正则表达式常用语法,并通过一个手机特号匹配的例子演示正则表达式 ...

  9. 带你用 Python 实现自动化群控设备

    1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和灰产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家聊聊企业 ...

  10. 涨见识!Java String转int还有这种写法

    先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个有颜值却假装靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题 ...