Eu tenho esta consulta atualmente, que seleciona o "número de coletas" superior em ordem decrescente. Eu preciso filtrar apenas as 10 primeiras linhas / números mais altos. Como posso fazer isso?
Tentei adicionar "WHERE ROWNUM <= 10" na parte inferior, sem sucesso.
SELECT customer.company_name, COUNT (item.pickup_reference) as "Number of Pickups"
FROM customer
JOIN item ON (customer.reference_no=item.pickup_reference)
GROUP BY customer.company_name, item.pickup_reference
ORDER BY COUNT (customer.company_name) DESC;
Obrigado por qualquer ajuda!
Respostas:
3 para resposta № 1Você precisa fazer uma subconsulta para que o rownum funcione.
SELECT *
FROM
(
SELECT customer.company_name, COUNT (item.pickup_reference) as "Number of Pickups"
FROM customer
JOIN item ON (customer.reference_no=item.pickup_reference)
GROUP BY customer.company_name, item.pickup_reference
ORDER BY COUNT (customer.company_name) DESC
)
WHERE rownum <= 10
Você também pode usar funções de classificação, mas dada a relativa simplicidade disso, não tenho certeza se o faria.
1 para resposta № 2
A solução usando a classificação é mais ou menos assim:
select customer.company_name, COUNT (item.pickup_reference) from (
select distinct customer.company_name, COUNT (item.pickup_reference) ,
rank() over ( order by count(item.pickup_reference) desc) rnk
from customer
JOIN item ON (customer.reference_no=item.pickup_reference)
group by customer.company_name, item.pickup_reference
order by COUNT (customer.company_name) )
where rnk < 10
Usar o "rownum" para obter o resultado superior nãodê o resultado esperado, porque obtém as 10 primeiras linhas que não foram ordenadas e, em seguida, ordene-as (notifique isso em um comentário sobre a resposta de Andrew, não tenho o direito de adicionar o comentário).