Oracle
 sql >> Database >  >> RDS >> Oracle

Come posso SELEZIONARE la prima riga con MAX(Column value)?

Perché la tua seconda query non funziona...

select   Item_No,
         Quantity
from     Rec_details
group by Item_No,
         Quantity
having   Quantity=max(Quantity);

Stai raggruppando per Item_No e Quantity e il Item_No sembra essere la chiave primaria e contiene valori univoci, quindi ogni gruppo conterrà solo una riga. Il HAVING la clausola cerca all'interno del gruppo in modo da verificare che il valore di quantity è il valore massimo all'interno di quel gruppo ma c'è un solo valore all'interno del gruppo, quindi questo sarà sempre vero. La tua richiesta equivale a:

SELECT DISTINCT
       Item_No,
       Quantity
FROM   Rec_details;

Alcuni altri modi per ottenere il valore massimo:

SQL Fiddle

Impostazione dello schema 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;

Query 1:ottieni una riga con quantity massima e l'ultimo item_no (usando 1 scansione tabella) :

SELECT MAX( item_no ) KEEP ( DENSE_RANK LAST ORDER BY Quantity ) AS Item_no,
       MAX( Quantity ) AS Quantity
FROM   Rec_Details

Risultati :

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

Query 2:ottieni una riga con quantity massima e l'ultimo item_no (usando 1 scansione tabella) :

SELECT *
FROM   (
  SELECT *
  FROM   Rec_details
  ORDER BY Quantity DESC, Item_no DESC
)
WHERE ROWNUM = 1

Risultati :

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

Query 3:ottieni tutte le righe con quantity massima (usando 1 scansione tabella) :

SELECT Item_no, Quantity
FROM   (
  SELECT r.*,
         RANK() OVER ( ORDER BY Quantity DESC ) AS rnk
  FROM   Rec_details r
)
WHERE rnk = 1

Risultati :

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

Query 4 - Ottieni tutte le righe con quantity massima (usando 2 scansioni della tabella) :

SELECT Item_no,
       Quantity
FROM   Rec_Details
WHERE  Quantity = ( SELECT MAX( Quantity ) FROM Rec_Details )

Risultati :

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