Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann ich die erste Zeile mit MAX (Spaltenwert) auswählen?

Warum funktioniert Ihre zweite Abfrage nicht...

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

Sie gruppieren sowohl nach Item_No und Quantity und die Item_No scheint der Primärschlüssel zu sein und enthält eindeutige Werte, sodass jede Gruppe nur eine Zeile enthält. Das HAVING -Klausel sucht innerhalb der Gruppe, sodass überprüft wird, ob der Wert von quantity ist der maximale Wert innerhalb dieser Gruppe, aber es gibt nur einen Wert innerhalb der Gruppe, sodass dies immer wahr ist. Ihre Abfrage ist das Äquivalent zu:

SELECT DISTINCT
       Item_No,
       Quantity
FROM   Rec_details;

Einige andere Möglichkeiten, um den Maximalwert zu erhalten:

SQL-Geige

Oracle 11g R2-Schema-Setup :

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;

Abfrage 1 – Holen Sie sich eine Zeile mit maximaler quantity und neuste item_no (mit 1 Tabellenscan) :

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

Ergebnisse :

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

Abfrage 2 – Holen Sie sich eine Zeile mit maximaler quantity und neuste item_no (mit 1 Tabellenscan) :

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

Ergebnisse :

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

Abfrage 3 – Alle Zeilen mit maximaler quantity abrufen (mit 1 Tabellenscan) :

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

Ergebnisse :

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

Abfrage 4 – Alle Zeilen mit maximaler quantity abrufen (unter Verwendung von 2 Tabellenscans) :

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

Ergebnisse :

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