根据其他两列添加 ID 列

EMc*_*agh 3 sql-server sql-server-2008-r2 cursors rank

我有一个查询,它返回如下输出:

 [Location] [Reference] [Year] [Int1] [Int2]
    England           1   2015     13    201
    England           1   2015     12     57
    England           1   2015      4     14
    England           2   2015     18     29
    England           2   2015     18     29
    England           1   2016     32     67
    England           1   2016     43     11
    England           2   2016     10     56
Run Code Online (Sandbox Code Playgroud)

其中 int1 和 int2 列表示有关位置的一些计算数据。我试图在报告中表示数据并意识到我可以使用表单的 ID 列:

 [ID][Location] [Reference] [Year] [Int1] [Int2]
    1   England           1   2015     13    201
    2   England           1   2015     12     57
    3   England           1   2015      4     14
    1   England           2   2015     18     29
    2   England           2   2015     33     12
    1   England           1   2016     32     67
    2   England           1   2016     43     11
    1   England           2   2016     10     56
Run Code Online (Sandbox Code Playgroud)

对于具有相同 Reference 和 Year 值的每一行,它都会增加。

到目前为止,我已经尝试使用排名函数来实现这一点,如下例所示,但运气不佳。

SELECT Location, Reference, Year, Int1, Int2,
DENSE_RANK() OVER (PARTITION BY Year ORDER BY Reference ASC) AS rnk
FROM Value
Run Code Online (Sandbox Code Playgroud)

退货

 [Location] [Reference] [Year] [Int1] [Int2][rnk]
    England           1   2015     13    201    1
    England           1   2015     12     57    1
    England           1   2015      4     14    1
    England           2   2015     18     29    2
    England           2   2015     33     12    2
    England           1   2016     32     67    1
    England           1   2016     43     11    1
    England           2   2016     10     56    2
Run Code Online (Sandbox Code Playgroud)

所以我的问题是有没有办法使用等级函数、等级、DENSE_RANK 等来实现这一点?如果不这样做,我最好的选择是什么?

有人建议 CURSOR 可以帮助我以这种方式对数据进行排序,但在阅读了它的使用之后,我想确定是否可以使用基于集合的方法。

我试图为这个问题创建一个 SQLFiddle,但目前我似乎无法创建 SQL Server 版本。我已经使用 MySQL 5.6创建了这个,所以你至少可以访问架构。道歉。

Mar*_*ith 5

您只需要

SELECT Location, 
       Reference, 
       Year,  
       Int1, 
       Int2,
       ROW_NUMBER() OVER (PARTITION BY Year, Reference 
                              ORDER BY Int2 DESC) AS [Id]
FROM Value
Run Code Online (Sandbox Code Playgroud)

给出你想要的结果(在线演示)

如果 Year,Reference,Int2 并列,这将在相关行之间任意分配顺序编号。