次のように出力を返すクエリがあります。
[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
ここで、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
これは、同じ参照値と年値を持つすべての行に対して増分されます。
私はこれまで、以下の例のようにランキング関数を使用してこれを達成しようとしましたが、運が悪かったです。
SELECT Location, Reference, Year, Int1, Int2,
DENSE_RANK() OVER (PARTITION BY Year ORDER BY Reference ASC) AS rnk
FROM Value
戻り値
[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
だから私の質問は、これを達成するためにランク関数、ランク、DENSE_RANKなどを使用する方法はありますか?それができない場合、私の最善の選択肢は何でしょうか?
CURSORは、この方法でデータを注文するのに役立つ可能性があることが示唆されていますが、その使用法を読んだ後、セットベースのアプローチが利用可能かどうかを判断したいと思います。
この質問のためにSQLFiddleを作成しようとしましたが、現時点ではSQLServerバージョンを作成できないようです。私はMySQL5.6を使用して これ を作成したので、少なくともスキーマにアクセスできます。お詫び申し上げます。
あなたはただ必要です
SELECT Location,
Reference,
Year,
Int1,
Int2,
ROW_NUMBER() OVER (PARTITION BY Year, Reference
ORDER BY Int2 DESC) AS [Id]
FROM Value
希望する結果を出すには( オンラインデモ) 。
結ばれたYear、Reference、Int2の場合、これは結ばれた行の間に連番を任意に割り当てます。