Как добавить строку в SQL Server после максимального ранга RANK () над разделом с помощью (T-SQL) - PullRequest
2 голосов
/ 07 октября 2019

Может быть, это просто, но я не смог этого сделать:

У меня есть таблица с месячными значениями. Они приходят из NAVISION, поэтому есть клиенты, у которых есть контракт и ежемесячная стоимость этого контракта. Я немного преобразовал данные, чтобы получить отправную точку:

data

Я написал этот запрос для извлечения данных:

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, дополнительная строка не должна появляться.

Очень сложно - я знаю. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.

Спасибо за вашу поддержку, ребята!

1 Ответ

2 голосов
/ 07 октября 2019

Вы можете сгенерировать строки с помощью select:

select eomonth(dateadd(day, 1, end_of_month_date)),
       customer_no,
       . . .   -- your rules for the rest of the columns
from (select t.*,
             row_number() over (partition by customer_no order by ranking desc) as seqnum
      from t
     ) t
where seqnum = 1 and
      end_of_month_date < getdate();

Вы можете поставить insert перед этим, чтобы вставить строки. Вы можете использовать union all для объединения в select.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...