不同的SQL平台,如何取前百分之N的记录?

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 最近帮业务部门梳理业务报表,其中有个需求是就算某指标等待时间最长的前百分之十,其实就是对等待时长进行倒序排序后,取结果集的前百分之十。这个需求在SQL Server和Oracle上都很容易实现,甚至是在MySQL 8.0也很容易实现,只是恰好我们业务数据库是MySQL 5.7先给大家介绍下不同数据库平台的实现方法。

SQL Server实现方法

SQL Server上有个TOP Percent的方法可以直接取结果的前(或后)百分之N例如有如下一张City表

100.jpg

我们取前10%的数据记录可以这样写:

SELECT

TOP 10PERCENT  

*

FROM City

ORDERBYIDDESC


结果如下:


101.jpg


Oracle实现方法

Oracle有个ROWNUM伪列可以用来帮助我们计算前百分之N。ROWNUM伪列的特点:

  • ROWNUM是按照记录插入时的顺序排序的
  • ROWNUM并不实际存在,是对筛选后的结果集的一个排序,如果不存在结果集就不会有ROWNUM
  • ROWNUM不能用基表名作为前缀
  • 在使用ROWNUM进行查询时,请注意:

   1)若使用大于号(>),则只能使用(>0),其他均不可以    2)若使用小于号(<),同一般情况    3)若使用等于号(=),则只能使用等于1(=1)我们可以先计算出整个表的记录行数量


SELECTCOUNT(*) CNT FROM City


然后根据count聚合查询总条数乘以百分比,来确定要查询的条数

SELECT0.1*COUNT(*) CNT FROM City


最后取出伪列小于共有数据的百分比的数据

SELECT * FROM CITY

WHEREIDIN

(

SELECTIDFROM

(

SELECTIDFROM CITY ORDERBYIDDESC

)

WHEREROWNUM < (SELECTCOUNT(*)*0.1FROM CITY)

)


注意:Oracle不支持子查询内ORDER BY,需要在外面再嵌套一层。



MySQL 8.0的实现方法

MySQL 8.0的实现方法主要是借助窗口函数ROW_NUMBER() OVER()。其实就是给排好序的集合添加一个自增长列,与Oracle的ROWNUM有点类似

SELECT * FROM

(

SELECT *,

ROW_NUMBER() OVER(ORDERBYIDDESC) rn

FROM  City

ORDERBYIDDESC

) a

WHERE a.rn<=(SELECT0.1*COUNT(*) FROM City)



MySQL 5.X的实现方法

我们知道MySQL 5.X是没有开窗函数ROW_NUMBER() OVER()的,那该如何实现呢?

这里我们需要借助变量来实现,其实思路还是创建一个自增长列,只是方法不同。

SELECT

 A.*,

 @row_num:=@row_num+1AS ROW_NUM

FROM

 City A , (SELECT @row_num:=0) B

ORDERBYIDDESC


这样我们就可以得到一张有自增长列的结果集了,接下来还是按照上面类似的方法,取前10%即可。


SELECT * FROM

(

SELECT

 A.*,

 @row_num:=@row_num+1AS ROW_NUM

FROM

 City A , (SELECT @row_num:=0) B

ORDERBYIDDESC

) C

WHERE C.ROW_NUM<=(@row_num*0.1)


其实MySQL 5.X也挺简单的,只是当时不怎么想用变量,想看看有没有其他办法,最后发现还是得用变量


以上就是不同平台的数据库求前百分之N的方法了,代码可以验证一下收藏起来留着下次直接套用。


总结

其中有涉及一些知识点,需要小伙伴们自己去进一步了解:

  • SQL Server的TOP PERCENT
  • Oracle的ROWNUM,子查询排序
  • ROW_NUMBER() OVER()
  • MySQL的变量




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL 分布式计算 NoSQL
【SQL 审核查询平台】Archery使用介绍
【SQL 审核查询平台】Archery使用介绍
182 0
【SQL 审核查询平台】Archery使用介绍
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_65 用户购买平台
「SQL面试题库」 No_65 用户购买平台
|
4月前
|
SQL 消息中间件 关系型数据库
从0到1构建一个Flink SQL流式计算平台
从0到1构建一个Flink SQL流式计算平台
50 0
|
4月前
|
SQL Java 关系型数据库
【Spring Boot+Thymeleaf+MyBatis+mysql】实现电子商务平台实战(附源码)持续更新~~ 包括sql语句、java、html代码
【Spring Boot+Thymeleaf+MyBatis+mysql】实现电子商务平台实战(附源码)持续更新~~ 包括sql语句、java、html代码
50 0
|
4月前
|
SQL 存储 安全
CloudQuery一体化数据库SQL操作安全管控平台
CloudQuery一体化数据库SQL操作安全管控平台
187 0
|
5月前
|
SQL 算法 JavaScript
在线就能用的 SQL 练习平台(附SQL学习文档)
在线就能用的 SQL 练习平台(附SQL学习文档)
150 0
|
9月前
|
SQL 数据库 数据库管理
Archery使用配置 【工单审核流详解】sql优化审核平台
Archery使用配置 【工单审核流详解】sql优化审核平台
|
9月前
|
SQL 关系型数据库 MySQL
Archery 系统配置 SQL优化审核平台配置【详解】
Archery 系统配置 SQL优化审核平台配置【详解】
|
11月前
|
SQL 数据可视化
数据可视化平台Datart-创建SQL视图
数据可视化平台、Datart
183 0
|
SQL 消息中间件 关系型数据库
Flink SQL 在米哈游的平台建设和应用实践
米哈游大数据实时计算团队负责人张剑,在 FFA 行业案例专场的分享
Flink SQL 在米哈游的平台建设和应用实践