SQL Server détermine la plupart des occurrences de données dans un groupe

Disons que j'ai ce qui suit:

COL1 COL2 COL3 ABC DATA1 ABC DATA1 ABC DATA2 ABC DATA3 DEF INFO1 DEF INFO2 DEF INFO3 DEF INFO3 

Je veux utiliser SQL pour propager la valeur qui se produit le plus souvent dans un groupe dans COL3 pour ce groupe. Donc, mes résultats seraient:

 COL1 COL2 COL3 ABC DATA1 DATA1 ABC DATA1 DATA1 ABC DATA2 DATA1 ABC DATA3 DATA1 DEF INFO1 INFO3 DEF INFO2 INFO3 DEF INFO3 INFO3 DEF INFO3 INFO3 

Des idées? SQL Server 2012

 ;With cte as ( col1,col2,row_number() over (partition by col1,col2 order by col1) as rownum ) select col1,col2,b.col2 as col3 from yourtable t cross apply ( select top1 col2 from cte c where c.col1=t.col1 order by rownum desc) b 

Je l'écrirais de cette façon:

 UPDATE P SET P.Col3=T.Col2 FROM Propagation P JOIN( SELECT TOP 1 WITH TIES Col1, Col2 FROM Propagation GROUP BY Col1, Col2 ORDER BY COUNT(*) DESC ) T ON T.Col1=P.Col1 

Merci à tous! J'ai utilisé une combinaison de réponses pour le faire fonctionner. Voici ce que j'ai trouvé:

 WITH OCCUR_EXT as ( SELECT [COL1], [COL2], row_number() over (partition by [COL1], [COL2] order by [COL1]) as TOT_OCCUR FROM [T_TABLEDATA] WHERE [COL2] > '' ), DOM_ASSGN as ( SELECT * FROM (SELECT *, row_number() OVER (partition by [COL1] order by [COL1], TOT_OCCUR DESC) as ROW_NMBR FROM OCCUR_EXT ) source WHERE ROW_NMBR = 1 ) UPDATE [T_TABLEDATA] SET [T_TABLEDATA].[COL3] = [DOM_ASSGN].[COL2] FROM [T_TABLEDATA], [DOM_ASSGN] WHERE [T_TABLEDATA].[COL1] = [DOM_ASSGN].[COL1] GO