sql取出每个分组的前几条

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql取出每个分组的前几条相关的知识,希望对你有一定的参考价值。

一个简单的方法就是排序之后给它分配序号,根据序号去找前几条

select * 

  from (select 公司,人数,

--按人数从多到少分配序号,不同公司会重1开始

           rank() over (partition by 公司 order by 人数 desc) as xh  

          from 公司档案) as A

 where xh<=2  --取前几位就写几

 order by 公司,人数 desc

排序效果如下

排序效果

最终让序号<=2,也就是取人数最多的前两个的效果如下

参考技术A

例如 score表 (科目,姓名,分数),取每科分数的前5名:


SELECT

a.科目,a.姓名,a.分数,COUNT(b.科目)

FROM  score  a

LEFT JOIN score  b 

ON  a.科目= b.科目  AND  a.分数 <= b.分数 

GROUP BY   a.科目,a.分数

HAVING  count( b.科目) <= 5 

参考技术B select top 5 字段1,字段2 ,sum(计算字段) from 查表 where 查询条件
gourp by 字段1 ,字段2
order by 字段1 ,字段2
注:top 5 表示显示前5条,根据实际情况修改

SQL中显示查询结果的前几条记录

在使用数据库查询语句的过程中,我们经常需要返回查询结果的前几条或者中间几条数据,下面是我总结的几种数据库常用的方法:(table是数据库表名,table2是table表的别名)

1、SQLServer

sqlserver支持top关键字,返回前若干条数据。

select top 5 * from table;// 返回前5行数据

2、MySQL

mysql支持limit,只能适用于mysql。limit子句用于强制select语句返回置顶的记录数,接受一个或两个数字参数,必须是整数常量。一个参数是返回前几条记录;两个参数时,第一个参数指定第一个返回记录行的偏移量(初始记录行的偏移量是0),第二个参数指定返回记录的最大数目。

一个参数:

select * from table limit 10; //返回前10行记录

两个参数:

select * from table limit 5,10; //返回第6-15行的记录
select * from table limit 5,-1; //返回第6行到最后一行的记录   (从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1)

select * from table limit 0,10 //返回前10行记录,和limit10的结果一样,即limit0,n=limit n

3、Oracle

Oracle需要使用rownum。

select * from table where rownum<=5; //返回前5条数据

4、DB2

select * from table fetch first 5 rows only; //返回前5条数据

select * from (select 列名1,列名2,row_number() over() as a from table) as table2  where a>=5 and a<=10;//返回第5行到第10行的数据

以上是关于sql取出每个分组的前几条的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的获取每个分组的前几条数据

SQL实现分组查询取前几条记录

mysql分组后,取每组的前3条数据(并且有顺序)

如何在MySQL中查询每个分组的前几名

SQL分组查询每组前几条数据

sql 实现分页+分组并取出分组内的前n条数据