get seulement la date de création maximale de la même table

Je veux get des données d'une table, mais seulement sélectionner le dernier ou le maximum CreateDate

voici ma requête:

 select Username, Password,Status,FirstLogin,CreateDate,UpdateDate,MasterID,FullName,Address,tm.Email,TempEmail,VerificationCode,PhoneNo,TempPhonoNo,TempPassword,LastSignIn,TempAccount,bod,ktp,Gender,CustType,VIP from UserData t inner join ( select Email, max(CreateDate) as MaxDate from userdata group by Email ) tm on t.Email = tm.Email and t.CreateDate = tm.MaxDate 

mais malheureusement, je reçois juste plusieurs résultats pour le même email, je veux juste get seulement 1 email qui a la date de création max:

voici exactement la même date de création:

 CreateDate FullName Email 2012-08-14 16:37:16.900 Mrs a [email protected] 2012-08-14 16:37:16.900 mrs a [email protected] 

et voici avec diffrent date de création:

 2012-11-24 20:34:44.930 0 zzzzz [email protected] 2012-11-16 08:13:45.217 0 zzzz [email protected] 

mais je veux seulement avoir un résultat comme celui-ci:

  CreateDate FullName Email 2012-08-14 16:37:16.900 Mrs a [email protected] 2012-11-24 20:34:44.930 0 zzzzz [email protected] 

Si vous n'obtenez pas assez d'unicité pour utiliser GROUP BY ou DISTINCT, vous pouvez utiliser ROW_NUMBER. Ce n'est pas la fonction la plus rapide, mais cela vous donnera un caractère unique. par exemple

 SELECT I.CreateDate ,I.FullName ,I.Email FROM ( SELECT T.CreateDate ,T.FullName ,T.Email ,ROW_NUMBER() OVER ( PARTITION BY T.Email ORDER BY T.FullName ) SEQ FROM UserData t INNER JOIN ( SELECT Email ,MAX(CreateDate) AS MaxDate FROM userdata GROUP BY Email ) TM ON T.Email = TM.Email AND T.CreateDate = TM.MaxDate ) I WHERE I.SEQ = 1 

Je pense que c'est un moyen assez facile d'get ce que vous voulez:

 select Username, Password, Status, FirstLogin, CreateDate, UpdateDate, MasterID, FullName, Address, Email, TempEmail, VerificationCode, PhoneNo, TempPhonoNo, TempPassword, LastSignIn, TempAccount, bod, ktp, Gender, CustType, VIP from (select ud.*, row_number() over (partition by email order by CreateDate desc) as seqnum from UserData ud ) ud where seqnum = 1; 

Vous avez seulement besoin d'utiliser la fonction window row_number() et n'avez pas besoin d'autres jointures ou agrégations.