2016-08-04 48 views
2

比方说,我有以下几点:SQL服务器上确定最Occurances数据在A组

COL1  COL2  COL3 

ABC  DATA1  
ABC  DATA1  
ABC  DATA2 
ABC  DATA3 
DEF  INFO1 
DEF  INFO2 
DEF  INFO3 
DEF  INFO3 

我想用SQL传播最经常出现一组到COL3该组的值。所以,我的结果是:

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 

任何想法? SQL Server 2012的

+5

你到目前为止尝试过什么?我们帮助修复代码,我们不是为了解决您的问题。 –

+0

如何解决关系? – Beth

+0

对不起,Marc - 我只是不知道从哪里开始 – MichaelTFL

回答

0
;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 
+0

谢谢!这非常有帮助! – MichaelTFL

0

我会写这样的说法:

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 
+0

谢谢!我开发的答案是这两个答案的组合。 – MichaelTFL

0

感谢所有!我使用了这些答案的组合来实现它的功能。这是我想出的:

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