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
3 Réponses :
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;
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?
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.
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