主流数据库 分组之后取每一组的前三行

SELECT *  
FROM  (SELECT 分组的字段名,   
                            ROW_NUMBER() OVER(PARTITION BY 分组的字段名 ORDER BY 排序的字段名) AS RN  
                  FROM 表名)  
WHERE RN <= 10   

以上为Oracle的方式(推荐)。在网上也有一种如下的写法,

SELECT t.*         
   FROM (SELECT ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段 DESC) rn,         
         b.*         
         FROM 表 b) t         
  WHERE t.rn <= 3  ;

但这种方式分组之后会有问题。

 

MySQL版:

select a.* 
from
(
select t1.*,(select count(*)+1 from 表 where 分组字段=t1.分组字段 and 排序字段

 

你可能感兴趣的:(oracle)