1
votes

choisir tous les moindres nombres positifs de l'ensemble de données

J'ai les données ci-dessous dans un tableau

ID  AMOUNT  DAYS
1   10  1
2   34  1
3   3   1

Je veux les résultats ci-dessous comme tous les montants qui ont le moins de jours d'un ID

ID  AMOUNT  DAYS
1   10  1
1   20  2
1   30  3
1   1   4
2   34  1
2   234 2
2   234 3
2   34  4
3   3   1
3   3   2
3   23  3
3   20  4

Veuillez suggérer une requête SQL pour sélectionner la sortie souhaitée


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser la fonction rank ()

select ID, Amount, Days from
(
 select rank() over (partition by ID order by days) as rn,
        t.*
   from tab t
)
where rn = 1;

Démo


2 commentaires

Qu'est-ce que la partition par colonne? et j'ai des nos négatifs aussi comment je peux sauter les négatifs


@Sami partition by est utilisé pour les critères de regroupement. Où est le négatif au fait?



1
votes

Pour votre exemple, vous pouvez simplement faire:

select t.id, min(t.days) as min_days,
       min(t.amount) keep (dense_rank first order by t.days asc) as min_amount
from t
group by t.id;

Si 1 n'est pas fixe, alors une sous-requête corrélée est une méthode:

select t.*
from t
where t.days = (select min(t2.days) from t t2 where t2.id = t.id);

Une autre méthode est l'agrégation:

select t.*
from t
where t.days = 1;

Bien sûr row_number () / rank () code> est une autre alternative.

Avec un index sur (id, jours) et une grande table, l'une des méthodes ci-dessus peut être plus rapide en pratique.


0 commentaires

0
votes

Commencez par grouper par identifiant pour trouver les jours minimum pour chaque identifiant, puis rejoignez la table

select t.*
from tablename t inner join (
  select id, min(days) days
  from tablename
  group by id
) g on g.id = t.id and g.days = t.days


0 commentaires