Рассчитайте ранг и примените его в соответствии с порядком - PullRequest
0 голосов
/ 03 мая 2019

Я хочу вычислить плотный ранг группы по предложению и установить свой ранг в порядке моего идентификатора строки, т.е. самые маленькие идентификаторы получают первый ранг и т. Д.

Я могу получить плотный ранг моих строк, но ранг применяется не в том порядке, в котором я хочу. Пример данных:

id          rang                 prop1       prop2        prop3     prop4                          
----------- -------------------- ----------- ----------- --------- -----
1244834     2                    609         96          0,02       0,00           
1244835     2                    609         96          0,02       0,00           
1244836     2                    609         96          0,02       0,00           
1244837     1                    609         96          0,00       0,01           
1244838     1                    609         96          0,00       0,01           
1244839     1                    609         96          0,00       0,01           

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

select id,
       DENSE_RANK() over (order by prop1, prop2, prop3, prop4) rang
       prop1,
       prop2,
       prop3,
       prop4,
from mytable
where ...
order by id

Я хочу, чтобы вычисленный ранг применялся в соответствии с моим порядком столбцов идентификаторов, зная, что идентификаторы являются последовательными.

Мои реальные данные имеют еще 15 свойств, которые используются для ранжирования, они не используются для заказа

В моем случае я хочу, чтобы звание было 1 = для идентификатора 124834, 124835, 124836 и звание = 2 для идентификатора 124837, 124838, 124839

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Если я правильно понимаю, то сначала вам нужно найти минимальный идентификатор для prop1, prop2, prop3, prop4 группы и рассчитать рейтинг для этого:

WITH cte AS (
    SELECT *, MIN(id) OVER (PARTITION BY prop1, prop2, prop3, prop4) AS min_id
    FROM (VALUES
        (1244834, 609, 96, 0.02, 0.00),
        (1244835, 609, 96, 0.02, 0.00),
        (1244836, 609, 96, 0.02, 0.00),
        (1244837, 609, 96, 0.00, 0.01),
        (1244838, 609, 96, 0.00, 0.01),
        (1244839, 609, 96, 0.00, 0.01)
    ) t(id, prop1, prop2, prop3, prop4)
)
SELECT *, DENSE_RANK() OVER (ORDER BY min_id) AS rnk
FROM cte
ORDER BY rnk, id
1 голос
/ 03 мая 2019

Похоже, вам просто нужно изменить направление prop3 с восходящего на нисходящее:

WITH VTE AS(
    SELECT *
    FROM (VALUES (1244834,2,609,96,0.02,0.00),           
                 (1244835,2,609,96,0.02,0.00),           
                 (1244836,2,609,96,0.02,0.00),           
                 (1244837,1,609,96,0.00,0.01),           
                 (1244838,1,609,96,0.00,0.01),           
                 (1244839,1,609,96,0.00,0.01)) V(id, rang, prop1, prop2, prop3, prop4))
SELECT VTE.id,
       VTE.rang,
       VTE.prop1,
       VTE.prop2,
       VTE.prop3,
       VTE.prop4,
       DENSE_RANK() OVER (ORDER BY prop1, prop2, prop3 DESC, prop4) AS Ranking
FROM VTE;
...