2015-03-30 4 views
2

Guys У меня есть следующий запрос:запрос, чтобы получить «MAX COUNT»

select count(*) AS num_items 
     from desc_look 
     group by dept 

Этот запрос возвращает количество элементов в каждом отделе. Однако я не могу получить ТОЛЬКО отдел с большим количеством предметов.

Я пытался использовать это, чтобы получить имя и идентификатор отдела с большинством пунктов

select dept, desc_up 
from desc_look 
where (select count(*) AS num_items 
     from desc_look 
     group by dept) 

Однако я получаю сообщение об ошибке ORA-00936, и я не знаю, почему. Я знаю, что я не могу использовать MAX (COUNT (*)), но есть ли способ обход этого?

+0

Имеет ли 'desc_up' столбец всегда содержит название отдела, который соответствует' dept_id' из тех же строк, то есть как название отдела и id хранятся в таблице 'desc_look'? –

ответ

4
select * from 
(
    select count(*) AS num_items 
    from desc_look 
    group by dept 
    order by count(*) desc 
) tmp 
WHERE ROWNUM = 1; 

Также посмотрите на howto limit the records in Oracle.

+0

Этот ответ не возвращает имя отдела и идентификатор, который запросил ОП. –

0

я думаю, что это может помочь вам

select count(*) AS num_items 
     from desc_look 
     group by dept 
     order by count(*) desc 
     limit 1 
+1

Я не думаю, что можно использовать 'LIMIT' в Oracle. –

0

Вы могли бы попробовать что-то вроде этого:

SELECT dept, num_items FROM (
    SELECT dept, COUNT(*) AS num_items 
     , ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) AS rn 
     FROM desc_look 
    GROUP BY dept 
) WHERE rn = 1; 
2

Этой версия в основном такие же, как Юрген-х лет, но используя аналитическую функцию вместо совокупности (GROUP BY) для подсчета:

SELECT t.dept, t.desc_up FROM 
    (SELECT dept, desc_up, 
    COUNT(*) over (partition BY dept) dept_count 
    FROM desc_look 
    ORDER BY dept_count DESC 
) t 
WHERE rownum = 1 

Если вы на Oracle 12, я вид nline не требуется, потому что вы можете использовать пункт строки ограничения (FETCH FIRST ...):

SELECT dept, desc_up, 
    COUNT(*) over (partition BY dept) dept_count 
FROM desc_look 
ORDER BY dept_count DESC 
FETCH FIRST 1 ROW ONLY