SQL Server - 密集/排名没有给出期望的结果

时间:2016-05-03 22:16:55

标签: sql sql-server sql-server-2014

我试图给两列排名。两列都是数值,一列代表X坐标,另一列代表Y坐标。

我的选择语句如下:

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坐标。然而,我的结果集不产生“唯一”坐标,或者如果两行具有相同的X但不同的Y值,则我得到X = 1,两行的Y = 1而不是X = 1,Y = 1& X = 1,Y = 2。

我的第一个问题是为什么会发生这种情况或者我做错了什么,其次看起来rank()/ Dense_Rank()看起来并不超出小数,是真的吗?

我已将值转换为int以消除与浮点数的可能冲突

+--------+--------+-----+----+--------------------------------------+------------------+
| 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 |
+--------+--------+-----+----+--------------------------------------+------------------+

1 个答案:

答案 0 :(得分:0)

所以我发现了我的逻辑缺陷。

以下是更正的声明:

          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的变化,因为这表明新的"行&#34 ;.我原来的陈述同样地看了X和Y,它们返回了不想要的结果。一旦我为X_Rank建立了关系,我只需要查看Y,因为它是有序的而不是Y相对于X的意思。抱歉我的可怜的解释但至少它有效。无论如何,谢谢你的帮助!