2011-02-14 33 views
1

我有值的表,更新获得check_order

col1  col2  col3 
1   0   ABA 
1   0   ABB 
1   0   ABC 
2   0   BBA 
2   0   BBB 
2   0   BBC 

我试图更新表格看COL1的重复次数,在这种情况下COL1一直重复这样每次更新3次了col2 1。

更新表后

需要的输出

col1  col2  col3 
1   1   ABA 
1   2   ABB 
1   3   ABC 
2   1   BBA 
2   2   BBB 
2   3   BBC 

回答

1

假设你正打算COL3是在非递减顺序递增,这应该这样做:

UPDATE MyTable 
SET col2=(SELECT COUNT(*) 
      FROM MyTable AS T2 
      WHERE T2.col1=T1.col1 AND T2.col3<=T1.col3) 
FROM MyTable AS T1 

您将获得COL2重复,如果在COL3重复特定的col1值。

如果你有兴趣,这里是一个相当详细(更昂贵的执行智慧)解决方案使用排名功能。它具有相同的问题(即计数被重复),用于COL1/COL3重复,因为以前的解决方案:-ing

UPDATE MyTable 
SET col2=(
    -- In the following query, DISTINCT merges rank dups caused by col3 dups 
    -- SELECT TOP(1) MyRank would also work. 
    SELECT DISTINCT MyRank 
    FROM (
     SELECT col3, 
       DENSE_RANK() OVER (PARTITION BY col1 ORDER BY col3) AS MyRank 
     FROM MyTable 
     WHERE col1=UpdatedTable.col1 
    ) As RankTable 
    WHERE RankTable.col3=UpdatedTable.col3) 
FROM MyTable AS UpdatedTable 
3

一个简单的ROW_NUMBER()应该工作

;with TMP as (
select *, row_number() over (partition by col1 order by col3) as RowNum 
from tbl 
) 
update TMP set col2=RowNum 

  • TBL:是你的表名
  • 分区由COL1:复位行由COL3编号为每个COL1组
  • 顺序:为COL1组
内编号的基础