8
votes

SQL. Y a-t-il un moyen efficace de trouver une deuxième valeur la plus basse?

J'ai le tableau suivant:

select min(price)
from table
where itemid not in
(select itemid
from table
where price=
(select min(price)
from table));


0 commentaires

9 Réponses :


4
votes
select price from table where price in (
    select 
        distinct price 
    from 
    (select t.price,rownumber() over () as rownum from table t) as x 
    where x.rownum = 2 --or 3, 4, 5, etc
)

4 commentaires

Cela pourrait fonctionner, mais le ce n'est pas nécessairement rangée 2. Il pourrait y avoir deux valeurs minimales comme ci-dessus, les éléments indiqués = 1 et 4 ont les deux 10


@Buras comment c'était ce qui précède? Mes excuses si cela ne fonctionne pas, je n'ai pas d'instance DB2 pour le tester.


@Tomstudee je crois que la fonction est orthographiée Row_Number ().


@Buras à l'aide de Row_Number () sur un ensemble de résultats intermédiaire de valeurs distinctes, il ne peut y avoir de valeurs en double sur la sélection de la plus interne. La sélection la plus à l'extérieur semble superflue telle qu'elle est écrite car elle affiche des prix en double, mais rien avec elle. Cependant, dans d'autres exemples, vous pourriez envisager d'utiliser dense_rank () car il identifiera plusieurs rangées si elles sont liées à la deuxième place. La fonction de rang () est légèrement différente et probablement pas utile ici, car s'il y a des valeurs nouées, les numéros de rang seront ignorés. Dans une cravate pour la 1ère place, la 2e place sera ignorée par rang (), mais pas par Dense_Rank ().



3
votes

Vous ne savez pas si ce serait le plus rapide, mais cela faciliterait la sélection du deuxième, troisième, etc., changez simplement la valeur supérieure.

Mise à jour xxx


2 commentaires

C'est une bonne solution, mais il pourrait y avoir deux valeurs minimales et ne fonctionnerait pas


Le haut n'est pas disponible dans db2



8
votes
SELECT MIN( price )
FROM table
WHERE price > ( SELECT MIN( price )
                FROM table )

0 commentaires

0
votes

Je suppose que le moyen le plus simple de faire consiste à utiliser le filtre offset-extravageur de standard SQL, distinct n'est pas nécessaire si vous n'avez pas de valeurs répétées dans votre colonne.

Sélectionnez Distinct (Prix) à partir de la table. ordre par prix Offset 1 rangée Fetch 1 rang 1 rangée seulement;

Pas besoin d'écrire des sous-requêtes complexes ....

in Amazon Redshift Utilisez Limite-récupération à la place pour ... xxx


0 commentaires

0
votes

Vous pouvez utiliser l'une des opérations suivantes: -

select top 1 ColumnName from TableName where ColumnName not in (select top 1 ColumnName from TableName order by ColumnName asc)


0 commentaires

0
votes

Je pense que vous pouvez trouver le deuxième minimum en utilisant limite et commander par xxx blockQuote>

Si vous voulez trouver troisième ou quatrième minimum et ainsi de suite ... vous pouvez le savoir en modifiant le nombre minimum de limite. Vous pouvez trouver à l'aide de cette déclaration.


0 commentaires

0
votes

C'est une bonne réponse:

SELECT MIN( price )
FROM table te1
WHERE price > ( SELECT MIN( price )
                FROM table te2 WHERE te1.brand = te2.brand)
GROUP BY brand


0 commentaires

0
votes

Pour connaître le deuxième salaire minimum d'un employé, vous pouvez utiliser le suivant:

select min(salary) 
from table 
where salary > (select min(salary) from table);


0 commentaires

0
votes

Vous pouvez utiliser Fonctions de rang , Il peut sembler une requête complexe mais des résultats similaires, tels que d'autres réponses peuvent être obtenus avec le même, xxx


0 commentaires