sql как выбрать три верхних значения в каждой категории

#sql #row-number

#sql #номер строки

Вопрос:

У меня есть таблица, содержащая подразделение, группу, класс, подкласс, как выбрать наибольшее количество 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
  

затем я хочу выбрать число строк <=3
Но он возвращает не может разрешить number_cnt , но мне нужно это number_cnt в порядке.

мои данные после того, как я подсчитаю количество каждого подкласса, будут такими

      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
  

Любая помощь?
Спасибо.

Комментарии:

1. Что здесь за категория?

2. Примеры данных и желаемых результатов действительно помогли бы.

3. он возвращает ошибку не удается разрешить number_cnt , но я думаю, что порядок по number_cnt находится за select .

4. Я также чувствую себя сбитым с толку из-за order by , внутри функции window устанавливается раздел, нужно ли мне упорядочивать по разделению, группе, классу, number_cnt desc

Ответ №1:

 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;
  

Ответ №2:

Пожалуйста, попробуйте, если это поможет.

     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
  

Комментарии:

1. Вероятно, было бы полезно объяснить ваш код и предоставить более подробную информацию.

Ответ №3:

Хммм. Предполагая, что вам нужны 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 for row_number() .

Примечание: имена ваших столбцов противоречивы. И вы не должны использовать ключевые слова SQL (например, group ) в качестве имен столбцов.