因为这个需求,所以百度找到了对于不同数据库的两种写法并附带上自己的浅显的理解,如果大家有更好的理解的方式或者更好的写法,请在评论处奉上您的想法,再次拜谢了
mysql :
- select a.*
- from
- (
- select t1.*,(select count(*)+1 from 表 where 分组字段=t1.分组字段 and 排序字段<t1.排序字段) as group_id
- from 表 t1
- ) a
- where a.group_id<=3
解释:
一张表
两个字段(分组字段、排序字段)
对于一张表的数据 复制一份同样的数据
然后通过这两张表(实际上数据是一样的)的相同的字段进行比较,获取分好组的 排好序的数据
即“分组字段=t1.分组字段 and 排序字段<t1.排序字段”
最后获取前3位 通过count(*)计数和比较运算符获得
真是有点只可意会 不可言传的感觉呢
select a.*
from
(
select t1.*,(select count(*)+1 from 表 where 分组字段=t1.分组字段 and 排序字段<t1.排序字段) as group_id
from 表 t1
) a
where a.group_id<=3
oracle:
- SELECT t.*
- FROM (SELECT ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段 DESC) rn,
- b.*
- FROM 表 b) t
- WHERE t.rn <= 3 ;
解释:
ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段 DESC) rn
over和其他的聚合函数的区别在于:
其他的聚合函数返回一个组中的一条数据
over返回一个组中的多条数据
rn表示数据条数