MSSQL: Dernière input dans GROUP BY (avec id)

Suivre / copyr la question de computhomas , mais append quelques rebondissements …

J'ai le tableau suivant dans MSSQL2008

id | business_key | result | date 1 | 1 | 0 | 9 2 | 1 | 1 | 8 3 | 2 | 1 | 7 4 | 3 | n | 6 5 | 4 | 1 | 5 6 | 4 | 0 | 4 

Et maintenant je veux regrouper basé sur le business_key returnnant l'input complète avec la date la plus récente. Donc mon résultat attendu est:

 id | business_key | result | date 1 | 1 | 0 | 9 3 | 2 | 1 | 7 4 | 3 | n | 6 5 | 4 | 1 | 5 

Je parie aussi qu'il y a un moyen d'y parvenir, je ne peux pas find / voir / penser pour le moment.

edit: désolé à ce sujet, je voulais dire autre chose de la question originale que j'ai faite. Je me sentais comme éditer cela pourrait être mieux que d'accepter une solution et de faire une autre question. mon problème original était que je ne filter pas par id.

 SELECT t.* FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY [business_key] ORDER BY [date] DESC ) AS [RowNum] FROM yourTable ) AS t WHERE t.[RowNum] = 1 
 SELECT * FROM mytable WHERE ID IN (SELECT MAX(ID) FROM mytable GROUP BY business_key) 
 SELECT MAX(T1.id) AS [id], T1.business_key, T1.result FROM dbo.My_Table T1 LEFT OUTER JOIN dbo.My_Table T2 ON T2.business_key = T1.business_key AND T2.id > T1.id WHERE T2.id IS NULL GROUP BY T1.business_key, T1.result ORDER BY MAX(T1.id) 

Edité sur la base de clarifications

 SELECT M1.* FROM My_Table M1 INNER JOIN ( SELECT [business_key], MAX([date]) as MaxDate FROM My_Table GROUP BY [business_key] ) M2 ON M1.business_key = M2.business_key AND M1.[date] = M2.MaxDate ORDER BY M1.[id] 

En supposant que la combinaison de business_key et date est unique alors ….

Exemple de travail (la 3ème fois est un charme):

 declare @src as table(id int, business_key int,result int,[date] int) insert into @src SELECT 1,1,0,9 UNION SELECT 2,1,1,8 UNION SELECT 3,2,1,7 UNION SELECT 4,3,1,6 UNION SELECT 5,4,1,5 UNION SELECT 6,4,0,4 ;with bkdate(business_key,[date]) AS ( select business_key,MAX([date]) from @src group by business_key ) select src.* from @src src inner join bkdate ON src.[date] = bkdate.date and src.business_key = bkdate.business_key order by id 

Que diriez-vous (édité après le changement de question):

 with latestdate as ( select business_key, maxdate=max(date) from the_table group by business_key ), latest as ( select ID = max(id) from the_table inner join latestdate on the_table.business_key=latestdate.business_key and the_table.date=latestdate.maxdate group by the_table.business_key ) select the_table.* from the_table inner join latest on latest.id=the_table.id