#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
) в качестве имен столбцов.