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创建了这个,所以你至少可以访问架构。道歉。
您只需要
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 并列,这将在相关行之间任意分配顺序编号。