在不同SQL平台取前百分之N的记录方法
![SQL](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
最近帮业务部门梳理业务报表,其中有个需求是就算某指标等待时间最长的前百分之十,其实就是对等待时长进行倒序排序后,取结果集的前百分之十。这个需求在SQLServer和Oracle上都很容易实现,甚至是在8.0也很容易实现,只是恰好我们业务数据库是MySQL5.7。
不同数据库平台的实现方法
- SQLServer:使用TOPPercent方法,直接取结果的前(或后)百分之N。
- Oracle:使用ROWNUM伪列,计算前百分之N的数据。
- MySQL 8.0:使用窗口函数ROW_NUMBER()OVER(),给排好序的集合添加一个自增长列。
- MySQL5.X:借助变量来实现,给排好序的集合添加一个自增长列。
SQLServer实现方法
sql SELECT TOP 10 PERCENT FROM City ORDER BY ID DESC;Oracle实现方法
sql SELECT FROM CITY WHERE ID IN ( SELECT ID FROM ( SELECT ID FROM CITY ORDER BY ID DESC ) WHERE ROWNUM < (SELECT COUNT() 0.1 FROM CITY) );MySQL 8.0实现方法
sql SELECT FROM ( SELECT , ROW_NUMBER() OVER (ORDER BY ID DESC) AS rn FROM City ORDER BY ID DESC ) a WHERE a.rn <= (SELECT 0.1 COUNT() FROM City);MySQL 5.X实现方法
sql SELECT A. FROM City A, (SELECT @row_num := 0) B ORDER BY ID DESC; SELECT FROM ( SELECT A., @row_num := @row_num + 1AS ROW_NUM FROM City A, (SELECT @row_num := 0) B ORDER BY ID DESC ) C WHERE C.ROW_NUM <= (@row_num 0.1);总结
上面介绍了不同数据库平台上计算前N%数据的几种方法。其中涉及的一些知识点,需要小伙伴们自己去进一步了解:
- TOPPercent方法
- ROWNUM伪列
- 窗口函数ROW_NUMBER()OVER()
- MySQL中的变量
希望文章对大家有所帮助,收藏起来留着下次直接套用吧!
SQL如何显示查询结果的前100条?
sqlserver支持top关键字,返回前100条数据。 selecttop100*fromtable;//返回前100行数据mysql支持limit,一个参数:select*fromtablelimit100;//返回前100行记录Oracle需要使用rownum。 select*fromtablewhererownum<=100;//返回前100条数据TOP子句TOP子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说,TOP子句是非常有用。 SQLServer的语法:SELECTTOPnumber|percentcolumn_name(s)FROMtable_namelimit子句用于强制select语句返回置顶的记录数,参数必须是整数常量。 一个参数是返回前几条记录;两个参数时,第一个参数指定第一个返回记录行的偏移量(初始记录行的偏移量是0),第二个参数指定返回记录的最大数目。 rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀拓展资料:SQL即结构化查询语言(StructuredQueryLanguage),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。 SQL语句无论是种类还是数量都是繁多的,很多语句也是经常要用到的,SQL查询语句就是一个典型的例子,无论是高级查询还是低级查询,SQL查询语句的需求是最频繁的。
sybase怎样通过sql获取前N条记录?麻烦告诉我
这个问题已经N个人问过N次了,首先我觉得取前n行是没有意义的!SYBASE说过在SQL SERVER 中行是没有最佳位置的(但然要是有clustered index 另当别论),从这个侧面看,在SQL SERVER 中前n行是没有实现实现基础的/MS SQL SERVER 是有隐式的 identity 列的所以可以用 select top n 字段 from 表或者 select * from tablename where rowid between 100 and 110如果认为这是SYBASE的不足,我觉得那是肤浅的表现了去年刚接触的时候,也是满地问人,现在想来实在是可笑之及!一点劣见,大家指正~~~
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。