169 похожих чатов

Всем привет! подскажите, пожалуйста, по оконным функциям. есть таблица клиентов

и их расходов. хочу посчитать скользящую сумму убытков за 12 месяцев (исходные данные по месяцам) в прошлое по состоянию на начало каждого последующего месяца. и это ладно, over/partition by/rows preceding почти решают вопрос (по кол-ву строк в прошлое), но есть сложность: не у всех клиентов были расходы каждый месяц, соответственно в таком случае строка по месяцу без активности для клиента отсутствует (например, идет январь 2020, а потом сразу июль 2020). как с этим можно совладать?
сейчас часть скрипта, где создается окно выглядит так:
sum([LOSS_SUM]) over (partition by ([CLIENT]) order by [DATE] rows between 11 preceding and current row) as [LOSS_SUM_BACK_12M]

7 ответов

10 просмотров

Сделайте cross join с месяцами чтобы для тех у кого не все месяца добавились строки с нулём

Примерно так declare @t table ([client] int, [date] date, loss_summ money); insert into @t values (1, '20210101', 1), (1, '20210401', 1), (1, '20210501', 1), (1, '20210601', 1), (1, '20211201', 1); with s as ( select client, date, sum(loss_summ) over (partition by client order by date) as loss_sum__rt, datediff(month, date, lead(date) over (partition by client order by date)) as n from @t ) select a.client, a.date, case when a.date = s.date then s.loss_sum__rt end from s cross apply ( select top (isnull(s.n, 1)) s.client, dateadd(month, row_number() over (order by 1/0) - 1, s.date) from master.dbo.spt_values ) a(client, date); Либо заведите постоянную таблицу-календарь

:D-L Автор вопроса

ух ты, спасибо вам большое! 👍

Слегка накосячил. Вот так будет правильнее with s as ( select client, date, loss_summ, sum(loss_summ) over (partition by client order by date) as loss_sum__rt from @t ) select a.client, b.date, s.loss_sum__rt from (select client, min(date) from @t group by client) a (client, date_min) cross apply (select top (12) dateadd(month, row_number() over (order by 1/0) - 1, a.date_min) from master.dbo.spt_values) b(date) left join s on s.client = a.client and s.date = b.date;

:D-L Автор вопроса

благодарю! сейчас разберусь, как это работает)

Вариант №3, окончательный 😊 with s as ( select client, date, loss_summ, sum(loss_summ) over (partition by client order by date) as loss_sum__rt from @t ) select a.client, b.date, s.loss_sum__rt from (select client, min(date) from @t group by client) a (client, date_min) cross apply ( select dateadd(month, t.n, a.date_min) from (values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11)) t(n) ) b(date) left join s on s.client = a.client and s.date = b.date;

:D-L Автор вопроса

Стикер

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
8
Вопрос на перед, на следующую пятницу. Сколько строк кода можно вешать на одного программиста, понятно что если проект хорошо написан то можно и миллион. Но есть же где то пре...
AlekseyK Kluchnikov
31
Карта сайта