|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
Добрый день. Помогите, пожалуйста разобраться, как работать с функцией LAG для решения задачи по поиску значения годом ранее в нужных мне разрезах? Поясню, что имею ввиду. Есть таблица Facts с полями: Дата, Товар, Магазин, Сумма Нужно посчтать для каждого Товара и Магазина - Сумму но в (Дата-12мес). Можно сделать джоином, тут проблем нет, все работает. Но хочется попробовать с LAG. Как получить нужное значение, НО с условием, что некоторые даты могут в прошлом быть пропущены (сдвиг указанный вручную -12 вытянет не то значение)? Вот мои жалкие попытки: with cte as (select Date, Tovar, Magaz, sum([Summ]) as Summ from [Facts] group by Date,Tovar,Magaz ) select Date, Tovar, Magaz, lag(Summ,12) over (order by [Period],Tovar,Magaz) as prev_value from cte Спасибо. Microsoft SQL Server 2017 (RTM) Еxpress Edition (64-bit) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 20:51 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
А что такое у вас [Period]? У вас есть только Date,Tovar,Magaz и sum([Summ]) из СТЕ. Если [Period] это Date, то почему вы делаете отступ в lag 12 строк? Это же не является 12 месяцам. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 21:06 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
LAG, точнее, window definition, не может отмерить ровно 12 месяцев. Я уж не говорю о том, что записи ровно 12 месяцев назад может и не быть, а может их быть и несколько. Определение окна может выделить группу, с которой работать (PARTITION BY), записи, с которыми работать (ROWS / RANGE - отсчитав либо в штуках, либо от и до), указать их сортировку (ORDER BY), и, наконец, сказать, какую по счёту запись собственно брать. Думаю, надо уточнить задачу, возможно, примером. Создайте адекватную модель в формате online fiddle, дайте ссылку, и покажите требуемый для него результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 21:07 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
Akina, PizzaPizza, На скрине пример данных таблицы Фактов. Данные все помесячные (всегда на 1 число месяца). Подскажите, как сделать запрос, который бы возвращал прошлогоднее значение для значения по дате 01.05.2020? То есть я хочу для даты 01.05.2020, в разрезах Tovar и Мagaz получить значение прошлогоднее (=50). Важно, что некоторые даты могут в прошлом пропущены. Спасибо, если кто сможет помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 23:25 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
Pallich Важно, что некоторые даты могут в прошлом пропущены. Значит это будет излишне сложный запрос. LAG/LEAD позволяют выбирать значения соседних записей, но не позволяют писать условия какая по счету запись к какой будет выбираться. Если уж ради спортивного интереса нужно LAG, то делайте календарик помесячный, соединяйте его по дате с вашими фактами, получите всегда 12 строк назад запись для товара. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 06:40 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
Pallich как сделать запрос, который бы возвращал прошлогоднее значение для значения по дате 01.05.2020? Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 07:47 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
Pallich На скрине пример данных таблицы Фактов. Идёте на, скажем, https://dbfiddle.uk/?rdbms=sqlserver_2014, заводите DDL и INSERT, проверяете, что не сбоит, и даёте ссылку плюс требуемый вывод для этих данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 07:50 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
Pallich, только тут проблема, если не будет данных за какой-нибудь месяц, то возьмется не предыдущий год, а пред предыдущий и так далее Лучше сделать пересечение на каждый месяц c таблицей календарем , и тогда обычным LAG с параметром 12 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 08:21 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
HandKot, Громадное спасибо! Посл.вопрос. Скажите, а как посчитать прошлог.значение сугубо для одной даты 01/05/2020? Просто влепить в конце where не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 11:57 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
Pallich, Оберни в подзапрос ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 12:05 |
|
Вопрос по LAG
|
|||
---|---|---|---|
#18+
env, select Result.Date, Result.Magaz, Result.Tovar, Result.Summ, Result.PrevValue from ( Select Month(t.[Date]) as' Month' , t.[Date] as 'Date' , t.Tovar as 'Tovar' , t.magaz as 'Magaz' , t.summ as 'Summ' , lag(t.summ, 1, null) Over (Partition By Month(t.[Date]) Order By t.[Date]) as PrevValue From @t t ) as Result where cast(Result.Date as date) = '2020-05-01' Есть! Спасибо всем!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 12:46 |
|
|
start [/forum/topic.php?fid=46&msg=39996770&tid=1685676]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 18ms |
total: | 150ms |
0 / 0 |