sql aide s'il vous plaît – get la dernière activité pour le client

Étant donné 2 tables

CustomerActivity CustomerId, ActivityId, CreatedOnDate 1, 1, 8/1/2010 1, 2, 8/15/2010 2, 1, 7/24/2010 2, 2, 8/15/2010 TempUpdateTable CustomerId, RecentActivityDate 1, NULL 2, NULL 

Comment remplir les valeurs NULL dans TempUpdateTable en utilisant la table CustomerActivity?

Ma première tentative n'a pas marché:

 UPDATE [TempUpdateTable] SET RecentActivityDate = (SELECT MAX(CreatedOnDate) FROM CustomerActivity CA WHERE CA.CustomerId = CustomerId ) 

Merci,

barre.

Vous pouvez aussi essayer ceci:

 UPDATE [TempUpdateTable] SET RecentActivityDate = Customers.MaxCreatedDate FROM (SELECT MAX(CreatedOnDate) as MaxCreatedDate, CA.CustomerId FROM CustomerActivity CA WHERE CA.CustomerId = CustomerId GROUP BY CA.CustomerId ) Customers WHERE TempUpdateTable.CustomerId = Customers.CustomerId 

Vous pouvez utiliser une expression CTE (Common Table Expression) pour find la dernière activité pour chaque client:

 ;WITH LastActivity AS ( SELECT CustomerID, ActivityID, CreatedOnDate, ROW_NUMBER() OVER(PARTITION BY CustomerId ORDER BY CreatedOnDate DESC) 'RowNum' FROM dbo.CustomerActivity ) SELECT * FROM LastActivity WHERE RowNum = 1 

Cela vous donnera une ligne pour chaque client avec l'activité qui a la dernière date. La PARTITION BY partitionne vos données par client, par exemple le countur recommence à 1 pour chaque nouveau client. ORDER BY définit l'ordre décroissant par date, de sorte que l'activité la plus récente / la plus récente soit la première, avec le numéro de ligne 1.

Vous pouvez maintenant utiliser le CTE pour mettre à jour votre autre table:

 ;WITH LastActivity AS ( SELECT CustomerID, ActivityID, CreatedOnDate, ROW_NUMBER() OVER(PARTITION BY CustomerId ORDER BY CreatedOnDate DESC) 'RowNum' FROM dbo.CustomerActivity ) UPDATE dbo.TempUpdateTable SET RecentActivityDate = act.CreatedOnDate FROM LastActivity act WHERE dbo.TempUpdateTable.CustomerId = act.CustomerID AND act.RowNum = 1 

Essaye ça:

 ;with LatestActivity as ( select CustomerId, max(CreatedOnDate) LastActivityDate from CustomerActivity ca group by CustomerId ) update tut set tut.RecentActivityDate = la.LastActivityDate from TempUpdateTable tut join LatestActivity la on tut.CustomerId = la.CustomerId 

Voici un moyen de le faire.

 UPDATE TempUpdateTable SET RecentActivityDate = ca.RecentActivityDate FROM TempUpdateTable JOIN ( SELECT CustomerId, MAX(CreatedOnDate) AS RecentActivityDate FROM CustomerActivity GROUP BY CustomerId ) ca ON TempUpdateTable.CustomerId = ca.CustomerId 

Bien qu'il soit un peu tard, c'est peut-être une réponse simple!

 SELECT ProjectID, StoreID, MAX(Date) AS Expr1, MAX(ActivityID) AS Expr2 FROM dbo.ProjectUpdates GROUP BY ProjectID, StoreID 

Cela donne la dernière activité réalisée dans un projet de magasin sage.