Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je sélectionner la première ligne avec MAX (valeur de colonne) ?

Pourquoi votre deuxième requête ne fonctionne pas...

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

Vous regroupez par les deux Item_No et Quantity et le Item_No semble être la clé primaire et contient des valeurs uniques, de sorte que chaque groupe ne contiendra qu'une seule ligne. Le HAVING la clause recherche dans le groupe afin de vérifier que la valeur de quantity est la valeur maximale dans ce groupe mais il n'y a qu'une seule valeur dans le groupe donc ce sera toujours vrai. Votre requête est l'équivalent de :

SELECT DISTINCT
       Item_No,
       Quantity
FROM   Rec_details;

Quelques autres façons d'obtenir la valeur maximale :

SQL Fiddle

Configuration du schéma 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;

Requête 1 - Obtenir une ligne avec une quantity maximale et le dernier item_no (en utilisant 1 balayage de table) :

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

Résultats :

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

Requête 2 - Obtenir une ligne avec une quantity maximale et le dernier item_no (en utilisant 1 balayage de table) :

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

Résultats :

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

Requête 3 – Obtenir toutes les lignes avec la quantity maximale (en utilisant 1 balayage de table) :

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

Résultats :

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

Requête 4 – Obtenir toutes les lignes avec la quantity maximale (en utilisant 2 balayages de table) :

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

Résultats :

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