|
Сослаться на предыдущее значение того же столбца
|
|||
---|---|---|---|
#18+
День добрый! Задачка: есть продукт (ID), есть дни, в которые этот продукт закупается (DayID), сколько должны отгрузить (Pln) и сколько по факту отгружено (Fct). Надо вычислить средневзвешенное по навороченной формуле с большим количеством case. Суть проблемы в том, что для этого агрегируются два поля, параметр (Par) и дельта (Delta) И в каждой следующей строке надо учитывать результат предыдущей дельты, которая вычислилась по нагромождению кейсов, в кейсах следующей строки Типа, если модуль дельты предыдущей строки меньше планируемой отгрузки в текущей строке, то вычти из плана этот модуль, иначе обнулить (вычисление параметра) (when abs(Delta_предыдущ)<Pln then Pln-abs(Delta_предыдущ) else 0) Или если модуль дельты предыдущей строки больше или равен факту в текущей, то вычти из факта план и этот модуль, иначе обнулить (вычисление дельты) (when abs(Delta_предыдущ)>=Fct then Fct-Pln-abs(Delta_предыдущ) else 0) Окно по продукту, шагаем по дням Lag сам на себя ссылаться не умеет, он бегает только по какому-то существующему до этого геморроя полю (по плану там или по факту) или я может быть совершенно не умею им пользоваться Отчаянно не хочу загонять все это в циклы и надеялась смочь в один запрос Почти неделю голову ломаю, помогите, пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2021, 16:12 |
|
Сослаться на предыдущее значение того же столбца
|
|||
---|---|---|---|
#18+
YoHnA, гуглите функцию LAG() а про нарастающий итог почитайте про кляузу OVER() ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2021, 16:57 |
|
Сослаться на предыдущее значение того же столбца
|
|||
---|---|---|---|
#18+
felix_ff, но у меня же написано, что Lag не подошел :( А нарастающий - как мне переменную в рамках окна щелкать? Разве конструкция @x=case when 1=1 then 0 end over (partition by ID order by DayID) оживет? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2021, 17:40 |
|
Сослаться на предыдущее значение того же столбца
|
|||
---|---|---|---|
#18+
YoHnA День добрый! Задачка: есть продукт (ID), есть дни, в которые этот продукт закупается (DayID), сколько должны отгрузить (Pln) и сколько по факту отгружено (Fct). Надо вычислить средневзвешенное по навороченной формуле с большим количеством case. Суть проблемы в том, что для этого агрегируются два поля, параметр (Par) и дельта (Delta) И в каждой следующей строке надо учитывать результат предыдущей дельты, которая вычислилась по нагромождению кейсов, в кейсах следующей строки Типа, если модуль дельты предыдущей строки меньше планируемой отгрузки в текущей строке, то вычти из плана этот модуль, иначе обнулить (вычисление параметра) (when abs(Delta_предыдущ)<Pln then Pln-abs(Delta_предыдущ) else 0) Или если модуль дельты предыдущей строки больше или равен факту в текущей, то вычти из факта план и этот модуль, иначе обнулить (вычисление дельты) (when abs(Delta_предыдущ)>=Fct then Fct-Pln-abs(Delta_предыдущ) else 0) Окно по продукту, шагаем по дням Lag сам на себя ссылаться не умеет, он бегает только по какому-то существующему до этого геморроя полю (по плану там или по факту) или я может быть совершенно не умею им пользоваться Отчаянно не хочу загонять все это в циклы и надеялась смочь в один запрос Почти неделю голову ломаю, помогите, пожалуйста Ни одна конструкция языка SQL не умеет "ссылаться на нечто, рассчитанное для предыдущей строки". Так устроены реляционные базы данных. И это правильно. В MS SQL есть исключение - рекурсивная кляуза with. Это плохой путь. Все ваши страдания решаются банальной накопительной суммой. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2021, 20:14 |
|
Сослаться на предыдущее значение того же столбца
|
|||
---|---|---|---|
#18+
YoHnA felix_ff, но у меня же написано, что Lag не подошел :( А нарастающий - как мне переменную в рамках окна щелкать? Разве конструкция @x=case when 1=1 then 0 end over (partition by ID order by DayID) оживет? Код: sql 1.
Читайте документацию и книжки всякие про это. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2021, 22:10 |
|
Сослаться на предыдущее значение того же столбца
|
|||
---|---|---|---|
#18+
YoHnA, [spoiler] сорян, я невнимательно прочитал ваш вопрос. ответ вам дал aleks222 [/sroiler] ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2021, 01:19 |
|
Сослаться на предыдущее значение того же столбца
|
|||
---|---|---|---|
#18+
felix_ff YoHnA, [spoiler] сорян, я невнимательно прочитал ваш вопрос. ответ вам дал aleks222 [/sroiler] Между тем /сролер - эта пять. Даже фсе десять! Такой тег обязательно должен быть на форуме! :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2021, 08:02 |
|
|
start [/forum/topic.php?fid=46&msg=40099597&tid=1684270]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 260ms |
total: | 395ms |
0 / 0 |