Может быть, это просто, но я не смог этого сделать:
У меня есть таблица с месячными значениями. Они приходят из NAVISION, поэтому есть клиенты, у которых есть контракт и ежемесячная стоимость этого контракта. Я немного преобразовал данные, чтобы получить отправную точку:
Я написал этот запрос для извлечения данных:
with NEW_CTE as (
SELECT End_of_Month_Date,Customer_No,Monthly_Contract_Value
, case
when customer_no<>lag(customer_No) over(order by customer_no,End_of_Month_Date) then NULL
else ISNULL(lag(Monthly_Contract_value) over(order by customer_no, End_of_Month_Date),0)
end as WertVormonat
, case
when customer_no<>lead(customer_No) over(order by customer_no,End_of_Month_Date) then NULL
else ISNULL(lead(Monthly_Contract_value) over(order by customer_no, End_of_Month_Date),0)
end as WertFolgemonat
,rank() OVER(partition by Customer_No ORDER BY Customer_No,End_of_Month_Date) as RANKING
FROM #contract_line)
Я пытаюсь получить совершенно новую строку после максимального ранга для клиента, поэтому в моем примере после ранжирования "24" мне нужна новая строка со следующими данными:
Конец месяца Дата: должен отображать конец следующего месяца после максимальный рейтинг месяца
Заказчик: должен отображать того же клиента
Ежемесячный контрактЗначение: 0
WertVormonat: должен отображать стоимость контракта за предыдущий месяц
WertFolgemonat: должен отображать NULL
Но это еще не все. Строка должна появляться только в том случае, если дата максимального ранжированного значения уже в прошлом. Если последняя дата примерно 01.01.2020, дополнительная строка не должна появляться.
Очень сложно - я знаю. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.
Спасибо за вашу поддержку, ребята!