Соответствующий рейтинг - PullRequest
2 голосов
/ 05 марта 2019

У меня есть такие данные:

contract    nr   startdate
   1        12    01-01-2000
   1        12    03-01-2000
   1        22    07-01-2000
   2        77    12-04-2001
   2        78    17-04-2001

Моя простая цель - ранжировать каждое число в рамках конкретного контракта с учетом даты начала.Вывод должен выглядеть следующим образом:

contract    nr   startdate    my_rank
   1        12    01-01-2000   1
   1        12    03-01-2000   1
   1        22    07-01-2000   2

   2        77    12-04-2001   1
   2        78    17-04-2001   2

Я перепробовал почти все возможные комбинации, но не смог разобраться.

select dense_rank() over
    (partition by contract order by nr) as my_rank,* from my_data

Выше достаточно близко, проблема в том, чтов некоторых случаях 1 присваивается самому последнему контракту, в других случаях он присваивается наименее последнему (?).Любой намек?

1 Ответ

3 голосов
/ 05 марта 2019

Ваш рейтинг на nr.

Если вы хотите ранжироваться по дате контракта, вам необходимо включить это.Но они разные по контракту.Итак, это требует дополнительного расчета:

select dense_rank() over (partition by contract order by min_startdate) as my_rank,
        d.*
from (select d.*,
             min(startdate) over (partition by contract, nr) as min_startdate
      from my_data d
     ) d;

Я не знаю, хотите ли вы min() или max() даты начала для вашего заказа.

...