Как внутри партиции сделать ранг так, чтобы у одинаковых значений были одинаковые ранги. Но при этом работал счетчик?
Есть таблица «"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 |