2016-05-03 16 views
1

2列にランクを付けようとしています。両方の列は数値で、1つはX座標を表し、もう1つはY座標を表します。次のようにSQL Server - 高密度/ランクで希望の結果が得られません

マイセレクトステートメントがある:

SELECT 
Dense_Rank() over (Partition by X,uniqueid Order by Y ASC) as Y_Rank, 
Dense_Rank() over (Partition by Y,uniqueid Order by X ASC) as X_Rank 
     ,[uniqueid]  
    ,[X] 
    ,[Y]  
    FROM xxxx.xxxxx 

上記のステートメントは、連結されたときのx/y座標を生成することである考え。しかし、私の結果セットは "ユニークな"座標を生成していないか、2つの行が同じXを持ち、異なるY値を持つ場合、X = 1、Y = 1ではなく、両方の行でX = 1、Y = 1になります。& X = 1 、Y = 2である。

私の最初の質問は、なぜこれが起こっているのか、何が間違っているのかです.2番目にrank()/ Dense_Rank()は10進数を超えて見えません。

私は、だから私は私のロジックに欠陥を発見した山車

+--------+--------+-----+----+--------------------------------------+------------------+ 
 
| X_Rank | Y_Rank | X | Y |    uniqueid    | Slot_Side | 
 
+--------+--------+-----+----+--------------------------------------+------------------+ 
 
|  1 |  1 | 29 | 4 | 00000000-0000-0000-0000-fffff27fdf27 |    1 | 
 
|  1 |  2 | 29 | 45 | 00000000-0000-0000-0000-fffff27fdf27 |    1 | 
 
|  1 |  1 | 52 | 6 | 00000000-0000-0000-0000-fffff27fdf2d |    1 | 
 
|  2 |  1 | 236 | 6 | 00000000-0000-0000-0000-fffff27fdf2d |    1 | 
 
|  1 |  1 | 33 | 45 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  1 |  1 | 5 | 3 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  2 |  1 | 55 | 3 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  2 |  1 | 83 | 45 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  3 |  1 | 133 | 45 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  3 |  1 | 105 | 3 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  4 |  1 | 155 | 3 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  4 |  1 | 183 | 45 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  5 |  1 | 233 | 45 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  5 |  1 | 205 | 3 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  6 |  1 | 255 | 3 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  6 |  1 | 283 | 45 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  7 |  1 | 333 | 45 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  7 |  1 | 305 | 3 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  8 |  1 | 355 | 3 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  8 |  1 | 383 | 45 | 00000000-0000-0000-0000-fffff27fe073 |    0 | 
 
|  1 |  1 | 5 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
|  2 |  1 | 41 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
|  3 |  1 | 77 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
|  4 |  1 | 113 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
|  5 |  1 | 149 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
|  6 |  1 | 185 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
|  7 |  1 | 221 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
|  8 |  1 | 257 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
|  9 |  1 | 293 | 2 | 00000000-0000-0000-0000-fffff27fe074 |    0 | 
 
+--------+--------+-----+----+--------------------------------------+------------------+

+0

"uniqueid"が本当にユニークな場合、ユニークな値でパーティショニングしているため、DENSE_RANK()のすべての値に対して1以外の値を取得するとは思いません... – ZLK

+0

@ZLK良い点、あなたが描いている意味ではユニークではありません。同じuniqueidを持つ複数の行があります(この値は各行の親を表します)。私はそれが必要な行をグループ化し、各uniqueidサブセットのランキングを行うので、その価値が必要です。希望は意味をなさない。 – Cjust689

+1

あなたが与えた例とは異なる結果が期待されているとは本当に理解できません。これらのX-Y座標はすべてユニークに見えます。それとも、それは生産するべきだと思っているのですか?そうしていないのですか? – ZLK

答えて

0

との衝突の可能性を取り除くためにint型に値をキャストしました。

  Select 
      Dense_Rank() over (Partition by Y,uniqueid Order by Y) as X_Rank, 
      Dense_Rank() over (Partition by uniqueid Order by Y) as Y_Rank 
      ,[uniqueid]  
      ,[X] 
      ,[Y]  
      FROM xxxx.xxxxx 

私はそれは偶然の一致は私が使っていたデータが与えられたとき、本当に私のX_Rank文が働いていた考えてだまされた:ここでは

を修正文です。訂正されたステートメントは、Yに基づいて優先順位付けまたはランク付け/パーティショニングを行うことにより、X_Rankに大きな重みを与えます。これは、新しい「行」の開始を示すので、Y値がXに対してどのように変化するかということです。私の元の声明は、XとYの両方を等しく見て、望ましくない結果を返しました。一度私がX_Rankの関係を作ってしまえば、Xとの関係でYが意味するものではなく、注文されたとおりにYだけ見る必要があります。私の貧弱な説明を申し訳ありませんが、少なくとも動作します。関係なく、助けてくれてありがとう!

関連する問題