2016-04-18 3 views
-1

Как выбрать строки, принадлежащие к самой большой группе?Выбрать строки из самой большой группы с помощью SQL

Предположим, мы имеем следующие таблицы, есть две категории/группы: Fruits (чем больше один) и Vegetables:

Name  | Category 
-------------------- 
Banana | Fruits 
Orange | Fruits 
Beetroot | Vegetables 

Как написать SQL, который будет выбирать только те строки из самой большой группы?

Banana 
Orange 
+2

Для каких СУБД вы хотите получить ответ? –

+0

Для базы данных postgres. –

+0

Итак, используйте вторую часть моего ответа. –

ответ

3

Вот ответ на Oracle:

select * 
from mytable 
where category = (select stats_mode(category) from mytable); 

Это получает вас только одну категорию. Таким образом, в случае галстука вы получаете одну из категорий с максимальным количеством отсчетов произвольно.

А вот ответ на СУБД не поддерживает STATS_MODE но отличая функции стандарта SQL окна:

select name, category 
from 
(
    select name, category, rank() over (order by cnt desc) as rnk 
    from 
    (
    select name, category, count(*) over (partition by category) as cnt 
    from mytable 
) counted 
) ranked 
where rnk = 1; 

С RANK вы получаете все категории с максимальным числом. Если вы хотите только одного из них в случае галстука, добавьте category в ORDER BY. (Благодаря dnoeth для коррекции.)

+0

'ROW_NUMBER' вместо' RANK' не будет работать, но добавляет 'category' в' ORDER BY'. – dnoeth

+0

@dnoeth: Спасибо за исправление. Вы правы, конечно. –

0

Я понял это (для PostgreSQL):

with mytable_count as (
    select category, count(category) as category_count 
    from mytable 
    group by category 
    order by category_count desc 
    limit 1 
) 
select mytable.* 
from mytable, mytable_count 
where mytable.category = mytable_count.category 
+0

Если есть галстук (две разные категории с одинаковым максимальным количеством), этот запрос будет возвращать только предметы одной категории. – jarlh

+0

Эй, ты игнорировал мой ответ ;-) Конечно, есть другие способы решить эту проблему, например. получать все подсчеты по категориям; получить максимальное количество из них; получить все категории с этим максимальным количеством; получить записи для этих категорий. Однако использование оконных функций более изящно и обычно быстрее, поскольку вы обращаетесь к таблице только один раз. –

Смежные вопросы