Как внутри партиции сделать ранг так, чтобы у одинаковых значений были одинаковые ранги. Но при этом работал счетчик?

Есть таблица «"DataBase1".Table1» в которой по временным интервалам (Start_DT – End_DT) содержится разнообразная информация по клиентам (в том числе и их канал обслуживания). Из этой таблицы нужно выбрать все данные (пример запроса ниже) и еще один расчетный столбец «Key» с возрастающим ключом, который увеличивается для каждого Клиента при каждой смене канала его обслуживания. Пример базового запроса к задаче 1:

SELECT
  CLIENT_ID, START_DT, END_DT, CHANNEL, «ваш текст» AS KEY
FROM
  "DataBase1".Table1
WHERE 1 = 1
  AND CLIENT_ID IN(123, 124)
ORDER BY
  CLIENT_ID, START_DT DESC

Пример выгрузки к задаче 1:

CLIENT_ID START_DT END_DT CHANNEL KEY
124 17.11.18 31.12.99 Массовый 1
124 10.10.18 16.11.18 Массовый 1
123 13.11.18 31.12.99 Массовый 3
123 12.11.18 12.11.18 Премьер 2
123 08.11.18 11.11.18 Массовый 1
123 13.10.18 07.11.18 Массовый 1

Т.е. внутри партиции CLIENT_ID нужен счетчик, который считает каждую смену канала. При этом выводится как дополнительное поле в данном SELECT.

Пробовала сделать оконной функцией DENSE_RANK()

SELECT CLIENT_ID, START_DT, END_DT, CHANNEL,
    DENSE_RANK() OVER (PARTITION BY client_id ORDER BY channel)
FROM table1
ORDER BY client_id DESC, start_dt DESC;

Вывод такой:

CLIENT_ID START_DT END_DT CHANNEL KEY
124 17.11.18 31.12.99 Массовый 1
124 10.10.18 16.11.18 Массовый 1
123 13.11.18 31.12.99 Массовый 1
123 12.11.18 12.11.18 Премьер 2
123 08.11.18 11.11.18 Массовый 1
123 13.10.18 07.11.18 Массовый 1

Ответы (1 шт):

Автор решения: ValNik

Посмотрите пример

client_id start_dt end_dt channel chkey
124 2018-11-17 1999-12-31 Массовый 1
124 2018-10-10 2018-11-16 Массовый 1
123 2018-11-13 1999-12-31 Массовый 3
123 2018-11-12 2018-11-12 Премьер 2
123 2018-11-08 2018-11-11 Массовый 1
123 2018-10-13 2018-11-07 Массовый 1
select *
  ,sum(isChange)over(partition by client_id order by start_dt)+1 key
from(
select *
  ,case when channel=lag(channel,1,channel)over(partition by client_id order by start_dt)
     then 0
   else 1
   end isChange
from Table1
)a
order by client_id desc,start_dt desc
client_id start_dt end_dt channel chkey ischange key
124 2018-11-17 1999-12-31 Массовый 1 0 1
124 2018-10-10 2018-11-16 Массовый 1 0 1
123 2018-11-13 1999-12-31 Массовый 3 1 3
123 2018-11-12 2018-11-12 Премьер 2 1 2
123 2018-11-08 2018-11-11 Массовый 1 0 1
123 2018-10-13 2018-11-07 Массовый 1 0 1

fiddle

→ Ссылка