2012-08-07 49 views
0

我有一个很大的查询(它已经根据我的需要进行了排序),其中一列被计算(varchar查询中其他列的组合)。我需要一个增量整数来识别这个计算列(重复应该有相同的ID)。 我不能使用等级,因为我需要增量编号的顺序使用另一个标准,而不是用于生成计算列的标准。如何使用生成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 

回答

3

使用

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

假设你使用SQL2005或更好

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

- 虽然像你说的这并未”用相同的身份证件来解决你的错误 - 啊!给我一个时间 - 应该是能够做到这一点很容易

编辑:

在这里你去 -

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 

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

+0

这就是我要做的。问题是,它像罪恶一样丑陋,可能像牛一样奔跑。也许让它成为CTE:从生成数据的“基础”查询开始,然后将其与自己结合以获得正确的顺序和排名?但是,如果没有“基本”代码,就无法真正做到这一点。 – 2012-08-07 13:35:06

+0

是的,她真的很丑 - 她的动作像一个slu in,但她完成了这项工作..这就是为什么我爱她 – Charleh 2012-08-07 13:38:57

+0

我看到 - 挂在上面,实际上可能有一阵子要洗衣服:) – Charleh 2012-08-07 13:50:16