Encuentre el mayor número de ocurrencias en una columna en SQL

Dada esta tabla:

Orden
custName descripción to_char (precio)
A desa $ 14
B desb $ 14
C desc $ 21
D desd $ 65
E dese $ 21
F desf $ 78
G desg $ 14
H desh $ 21

Estoy tratando de mostrar toda la fila donde los precios tienen las ocurrencias más altas, en este caso $ 14 y $ 21

Creo que debe haber una subconsulta. Entonces comencé con esto:

select max(count(price))  
from orders  
group by price

lo que me da 3.

después de un tiempo no pensé que fuera útil. Creo que necesitaba el valor 14 y 21 en lugar del recuento, así que puedo ponerlo en la cláusula where. pero estoy atascado en cómo mostrar eso. ¿alguna ayuda?

ACTUALIZACIÓN: Así que lo conseguí para consultar el 14 y el 21 de este

    select price
    from orders
    group by price
    having (count(price)) in
    (select max(count(price))
    from orders
    group by price)

pero lo necesito para mostrar el nombre de cliente y la columna de descripción que me sale un error:

select custname, description, price
from orders
group by price
having (count(price)) in
(select max(count(price))
from orders
group by price)

SQL Error: ORA-00979: not a GROUP BY expression

alguna ayuda en esto?

preguntado el 08 de enero de 11 a las 19:01

Eche un vistazo a mi respuesta:

¿Su respuesta está ayudando a mi pregunta inicial o la pregunta de actualización con el error? Intenté usar tu, pero también obtengo algunos errores.

4 Respuestas

Supongo que estás bastante cerca. Dado que HAVING opera en el conjunto de resultados agrupado, intente

HAVING COUNT(price) IN

or

HAVING COUNT(price) =

reemplazando su línea actual.

Respondido el 08 de enero de 11 a las 23:01

Me metí con eso y obtuve lo mismo. aunque gracias! - Ronnie

Como etiquetó la pregunta como oráculo, puede usar funciones de ventana para obtener datos agregados y detallados dentro de la misma consulta.

SELECT   COUNT (price) OVER (PARTITION BY price) count_at_this_price, 
         o.* 
from orders o 
order by 1 desc

Respondido el 08 de enero de 11 a las 23:01

select employee, count(employee)
from work
group by employee
having count(employee) =
( select max(cnt) from
( select employee, count(employee cnt
from work
group by employee
)
);

Referencia

Respondido el 08 de enero de 11 a las 23:01

Podrías intentar algo como

select * from orders where price in (select top 2 price from orders group by price order by price desc)

No estoy seguro de limitar los resultados en Oracle, en SQL Server es superior, tal vez debería usar limit.

Respondido el 08 de enero de 11 a las 23:01

esta es una tarea y nunca he aprendido la función principal todavía (pero útil en el futuro), así que no creo que pueda usarla. aunque gracias! - Ronnie

TOP no está disponible en Oracle. Está disponible en SQL Server y probablemente en algunas otras bases de datos. Justin Cave

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.