J'ai ces données dans la base de données sur les utilisateurs consacrant du temps à une activité particulière.
J'ai l'intention d'obtenir les données lorsque chaque l'utilisateur a passé le nombre maximum d'heures.
Quelque chose comme ceci:
Select Id, Name, HoursSpent, Date from HoursSpent
Where HoursSpent = (SELECT MAX(HoursSpent) FROM HoursSpent)
3 Réponses :
Vous voulez une clause de corrélation :
select hs.Id, hs.Name, hs.HoursSpent, hs.Date
from HoursSpent hs
where hs.HoursSpent = (select max(hs2.HoursSpent)
from HoursSpent hs2
where hs2.name = hs.name
-----------------------------^ this is the correlation clause
);
Cela dit que pour chaque nom dans HoursSpent , choisissez la ligne qui a la valeur maximale de HoursSpent.
J'utiliserais ROW_NUMBER ici:
SELECT Id, Name, HoursSpent, Date
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY HoursSpent DESC) rn
FROM HoursSpent
) t
WHERE rn = 1;
Si à la place vous voulez trouver plus d'un enregistrement par nom qui pourrait être lié pour le nombre maximum d'heures passées , puis remplacez ROW_NUMBER par RANK.
Voici comment obtenir le nombre maximum d'heures par utilisateur:
select hs2.Id, hs2.Name, hs2.HoursSpent, hs2.Date
from HoursSpent hs2
join (
select hs.Name, max(hs.HoursSpent)
from HoursSpent hs
group by hs.Name;
) hs
on hs2.Name = hs.Name and hs2.HoursSpent = hs.HoursSpent;
Maintenant, faisons un peu de participation:
select hs.Name, max(hs.HoursSpent) from HoursSpent hs group by hs.Name;
Quels rdbms utilisez-vous?