¿Por qué su segunda consulta no funciona...
select Item_No,
Quantity
from Rec_details
group by Item_No,
Quantity
having Quantity=max(Quantity);
Está agrupando por ambos Item_No
y Quantity
y el Item_No
parece ser la clave principal y contiene valores únicos, por lo que cada grupo solo contendrá una fila. El HAVING
La cláusula busca dentro del grupo, por lo que verificará que el valor de quantity
es el valor máximo dentro de ese grupo, pero solo hay un valor dentro del grupo, por lo que siempre será cierto. Su consulta es el equivalente a:
SELECT DISTINCT
Item_No,
Quantity
FROM Rec_details;
Algunas otras formas de obtener el valor máximo:
Configuración del esquema de Oracle 11g R2 :
create table Rec_details (item_no, Quantity ) AS
SELECT 12507,1 FROM DUAL UNION ALL
SELECT 12549,4 FROM DUAL UNION ALL
SELECT 12100,8 FROM DUAL UNION ALL
SELECT 12501,2 FROM DUAL UNION ALL
SELECT 12201,7 FROM DUAL UNION ALL
SELECT 12509,3 FROM DUAL UNION ALL
SELECT 12080,1 FROM DUAL;
Consulta 1:obtenga una fila con la quantity
máxima y el último item_no
(usando 1 escaneo de tabla) :
SELECT MAX( item_no ) KEEP ( DENSE_RANK LAST ORDER BY Quantity ) AS Item_no,
MAX( Quantity ) AS Quantity
FROM Rec_Details
| ITEM_NO | QUANTITY |
|---------|----------|
| 12100 | 8 |
Consulta 2:obtenga una fila con la quantity
máxima y el último item_no
(usando 1 escaneo de tabla) :
SELECT *
FROM (
SELECT *
FROM Rec_details
ORDER BY Quantity DESC, Item_no DESC
)
WHERE ROWNUM = 1
| ITEM_NO | QUANTITY |
|---------|----------|
| 12100 | 8 |
Consulta 3:obtenga todas las filas con la quantity
máxima (usando 1 escaneo de tabla) :
SELECT Item_no, Quantity
FROM (
SELECT r.*,
RANK() OVER ( ORDER BY Quantity DESC ) AS rnk
FROM Rec_details r
)
WHERE rnk = 1
| ITEM_NO | QUANTITY |
|---------|----------|
| 12100 | 8 |
Consulta 4:obtenga todas las filas con la quantity
máxima (usando 2 escaneos de tablas) :
SELECT Item_no,
Quantity
FROM Rec_Details
WHERE Quantity = ( SELECT MAX( Quantity ) FROM Rec_Details )
| ITEM_NO | QUANTITY |
|---------|----------|
| 12100 | 8 |