web-dev-qa-db-ja.com

他の2つの列に基づいてID列を追加する

次のように出力を返すクエリがあります。

 [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を使用して これ を作成したので、少なくともスキーマにアクセスできます。お詫び申し上げます。

3
EMcDonagh

あなたはただ必要です

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

希望する結果を出すには( オンラインデモ)

結ばれたYear、Reference、Int2の場合、これは結ばれた行の間に連番を任意に割り当てます。

5
Martin Smith