sql如何选择每个类别中的前三个值

时间:2016-10-06 20:20:09

标签: sql row-number

我有一个表包含division,group,class,sub_class, 如何在每个子类中选择最高的3个计数

   select    division ,group,class,sub_class, count(*) as number_cnt, 

               ROW_NUMBER() over ( partition by division ,group,class 
               order by  number_cnt ) as RowNum  
  from mydata 
  order by  division,group,class, number_cnt desc

然后我想选择RowNum< = 3 但它返回无法解析number_cnt,但我需要按顺序排列这个number_cnt。

我计算每个sub_class的数量之后的mydata将是这样的

     division   group   class            subclass        number_cnt
     plant      fruit   tropical fruit   banana          10
                                         jackfruit       5
                                         passion fruit   3
                                         coconut         2

我希望为每个分组 - 小组 - 类 - 子类组合

选出前三个计数
     division   group   class            subclass        number_cnt
     plant      fruit   tropical fruit   banana          10
                                         jackfruit       5
                                         passion fruit   3

有任何帮助吗? 感谢。

3 个答案:

答案 0 :(得分:0)

SELECT division,
       group,
       class,
       sub_class,
       ROW_NUMBER() over ( partition by trade_division ,group,class 
                       order by  number_cnt ) as RowNum   

  FROM
    (      select   division ,
                    group,
                    class,
                    sub_class, 
                    count(*) OVER ( PARTITION BY trade_division,group,class ) AS number_cnt               
           from my data 
     )

 WHERE RowNum <=3
order by  division,group,class, number_cnt desc;

答案 1 :(得分:0)

嗯。假设您想要每个部门/组/类的10个最高子类:

select t.*
from (select division, group, class, sub_class, count(*) as number_cnt, 
               row_number() over (partition by division, group, class
                                  order by count(*) desc
                                 ) as seqnum  
      from my data 
      group by division, group, class, sub_class
     ) t
where seqnum <= 10;

您希望将Windows功能与聚合一起使用。请注意,sub_class位于group by,而partition by位于row_number()

注意:您的列名称不一致。而且,您应该使用SQL关键字(例如group)作为列名。

答案 2 :(得分:0)

请尝试这是否有帮助。

    SELECT * from( 
    select    division ,group,class,sub_class, count(*) as number_cnt, 
    ROW_NUMBER() over ( partition by trade_division ,group,class 
    order by  number_cnt ) as RowNum  
    from my data ) a
    WHERE RowNum<=3