2009-10-08 7 views
0

J'ai une table qui est un peu comme une table historique ... donc j'avoir des données comme celui-ciSql Server à double sous-requête

idA numberMov FinalDate
1 10 20090209
2 14 20090304
1 12 20090304
3 54 20080508
4 42 20090510
... ... ....

Je dois récupérer le numberMov basé sur le plus récent finalDate de chaque idA donc j'utiliser ce

select a.numberMov from (select idA, max(finalDate) maxDate from table1 group by idA) as b inner join table1 a on a.idA=b.idA and a.finalDate = b.maxDate

Maintenant, j'ai une autre requête comme celui-ci

select m fields from n tables where n5.numberMov in ("insert first query here")

Je me sens comme il y a une meilleure solution, mais ne peux pas penser à tout, je n'aime vraiment pas avoir deux sous-requêtes là-bas.

Des suggestions?

Répondre

0

Pas assez d'informations pour tester moi-même, mais quelque chose comme ça pourrait fonctionner.

select m fields 
from a inner join 
(select numberMov, 
    max(FinalDate) as maxDate 
from a 
group by numberMov) b 
    on a.numberMov = b.numberMov 
    and a.FinalDate = b.maxDate inner join 
n tables on a.numberMov = n.numberMov 
0

Vous ne dites pas quelle édition de SQL Server, mais cela fonctionne dans SQL 2005+

;WITH rankCTE 
AS 
(
    SELECT idA 
      ,numberMov 
      ,FinalDate 
      ,ROW_NUMBER() OVER (PARTITION BY idA 
           ORDER BY FinalDate DESC 
          ) AS rn 
    FROM table1 
) 
,latestCTE 
AS 
(
    SELECT idA 
      ,numberMov 
      ,FinalDate 
    FROM rankCTE 
    WHERE rn = 1 
) 
SELECT m fields 
FROM n tables 
WHERE n5.numberMov IN (SELECT numberMov FROM latestCTE)