2016-05-03 2 views
1

Я пытаюсь присвоить ранг двум столбцам. Оба столбца являются числовыми значениями, а один представляет собой координату X, а другой - координатой Y.SQL Server - Dense/Rank не дает желаемых результатов

Мой оператор выбора заключается в следующем:

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 = 1, Y = 1 для обеих строк, а не X = 1, Y = 1 & X = 1 , Y = 2.

Мой первый вопрос: почему это происходит или что я делаю неправильно, и, во-вторых, кажется, что rank()/Dense_Rank() не выходит за пределы десятичной, это правда?

Я бросил значение в целое, чтобы удалить возможные конфликты с поплавками

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

Если «unique unique» действительно уникален, я не ожидаю, что вы получите что-либо кроме 1 для всех ваших значений DENSE_RANK(), потому что вы разбиваете на разделы по уникальному значению ... – ZLK

+0

@ZLK Хорошая точка, он не уникален в том смысле, который вы описываете. Существует несколько строк с одним и тем же уникальным (это значение представляет родительский элемент для каждой строки). Мне нужно, чтобы это значение присутствовало, когда оно группирует необходимые строки и делает ранжирование на каждом уникальном подмножестве. Надеюсь, это имеет смысл. – Cjust689

+1

Я действительно не понимаю, какие результаты вы ожидаете, которые отличаются от приведенного вами примера. Все эти координаты X-Y выглядят уникальными. Или это то, что вы думаете, что оно должно производить, и это не так? – ZLK

ответ

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 заявление работало, когда на самом деле это было совпадение, учитывая данные, которые я использовал. Исправленный оператор дает больше веса X_Rank, определяя приоритет или ранжируя/разбивая его на основе Y. Идея состоит в том, что мне действительно интересно, где значения Y изменяются относительно X, поскольку это указывает на начало новой «строки». В моем первоначальном заявлении мы рассматривали как X, так и Y одинаково, что возвращало нежелательные результаты. Как только я сделал отношения для X_Rank, мне нужно только взглянуть на Y, поскольку он упорядочен, а не на то, что Y означает по отношению к X. Извините за мое плохое объяснение, но по крайней мере оно работает. Спасибо за помощь независимо!

Смежные вопросы