在组内枚举n行

时间:2017-06-23 10:32:49

标签: sql sql-server

我有一个表,我必须在其中枚举n个元素的行

例如,如果n = 3,我希望得到以下结果:

 initial table    result table      
 | ID | DATA |    | ID | DATA |
 |----|------|    |----|------|
 | 1  | a    |    | 1  | 1 a  |
 | 2  | b    |    | 2  | 2 b  |
 | 3  | c    |    | 3  | 3 c  |
 | 4  | d    |    | 4  | 1 d  |
 | 5  | e    |    | 5  | 2 e  |
 | 6  | f    |    | 6  | 3 f  |
 | 7  | g    |    | 7  | 1 g  |`

我已经通过以下代码完成了我需要的工作:

UPDATE test 
    SET data = i.num +''+ data
     FROM (
      Select id, cast(ROW_NUMBER() OVER(PARTITION BY [num] ORDER BY [num])as char) as num 
      from (select id, (row_number() over (order by id)+2 )/3  as num from test) j) i
    WHERE 
        i.id = test.id

但是,我认为还有更好的方法。我非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

你的方法很好。我将使用模数运算符的可更新CTE:

with toupdate as (
      select t.*,
             cast( 1 + (row_number() over (order by id) - 1) % 3 as varchar(255)) as num3
      from test t
     ) 
update toupdate 
    set data = num3 + ' ' + data;