sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo puedo SELECCIONAR la primera fila con MAX (valor de columna)?

¿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:

SQL Fiddle

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

Resultados :

| 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

Resultados :

| 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

Resultados :

| 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 )

Resultados :

| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |