如何在计算列中为不同的值使用生成Id?

时间:2012-08-07 13:16:20

标签: sql-server

我有一个大查询(已根据我的需要进行排序),其中一个列被计算(查询中其他列的varchar组合)。我需要一个增量整数来标识这个计算列(重复项应具有相同的id)。 我不能使用排名,因为我需要增量号的顺序使用的另一个标准不是用于生成计算列的标准。

这就是我需要的:

OrderByColumn              CalculatedColumn          GeneratedId
    1                        ggg                       1
    1                        aaa                       2
    1                        ggg                       1
    1                        fff                       3
    2                        vvv                       4
    2                        ddd                       5
    3                        ggg                       1
    4                        rrr                       6
    5                        aaa                       2
    5                        ooo                       7
    5                        kkk                       8
    8                        vvv                       4
    9                        aaa                       2

1 个答案:

答案 0 :(得分:3)

使用

ROW_NUMBER() OVER (PARTITION BY XXX ORDER BY YYY) 

假设您使用的是SQL2005或更好的

http://msdn.microsoft.com/en-us/library/ms186734.aspx

- 虽然你说这不能解决你身上带有相同ID的傻瓜 - 啊!给我一点时间 - 应该能够做到这一点非常容易

编辑:

你去吧 -

http://sqlfiddle.com/#!3/2f014/2

-- Select stuff:
select vals.val as genid, ord.* from ord
-- Join back to a distinct list of CalculatedColumn with a row_number() to id them
inner join
(select calculatedcolumn, row_number() over (order by calculatedcolumn) as val  from ord group by calculatedcolumn) as vals on vals.calculatedcolumn = ord.calculatedcolumn
order by ord.orderbycolumn

当然这是使用子查询中的计算列 - 所以除非将值存储在临时表或表变量中,否则需要重新计算