Сравнивать текущую дату с датой последнего обновления поля если на поле был 0. 20.01.2020 товар закочился, значение стало 0. 22.01.2020 товар завезли. Запрос видит, что предыдущее значение было 0 и добавляет к DOOS разницу в днях. CASE WHEN в апдейт встроить и будет работать
А можно пример запроса?
UPDATE table SET doos=doos+(Сегодня-прошлая дата)*(stock!='Y'), stock='Y' Я не помню какими функциями брать чисельно разницу дат в днях, но такого в инете хватает. Даже CASE WHEN не надо
эти непонятные операции такие некрасивые. Лучше описать всё адекватно, а не как я городить забор с сравнениями внутри присвоения
Я бы через джойн на generate_series (или выделенный в отдельную таблицу календарь) сделала, чтобы получить полные наборы дат. Типа джойн по условию с даты последнего появления товара до текущей даты. Хотя не уверена, что правильно поняла, что требуется получить в итоге.
Это похоже на то что нужно
Блин, интересная задача. Я б на чистом sql решил, но раньше пн вечером не смогу сесть
Я пока так и не решил до конца)
Раз уж вы пошли в оконные функции, то тогда делайте математику через first_value(), т.е. что-то типа date - (first_value(date) OVER …) только вам надо распарсить даты из строк
через оконные функции с order by по date
Через оконные функции там надо хитрее — объединить через PARTITION BY строки в группы с последней где ещё пока было в наличии (включительно) по последнюю где ещё пока не было (тоже включительно).
Лень сейчас разбираться в задаче. По первому взгляду сразу понятно что задача отлично решается через оконки
Откуда данная задача?
date - first_value(date) - это круто. Благодарю! А не через оконные как можно реализовать?
Доработал ваше решение (завернув ещё в пару select'ов): https://sqlize.online/sql/psql14/e832f9d96d599e6d49a8cdbe6fae1ffe/ Получилось страшно, конечно, было бы интересно увидеть решение попроще и поэлегантней. А так угарная задача, я увеселился, спасибо.
Бизнес аналитика
Так и задумано, что первый день имеет нулевой doos?
Нет, для этих дней он по хорошему должен быть null, т.к. нет предыдущей записи с stock = 'Y'.
Дополировать решение, чтобы не считать этот doos когда batch is null я вам уже предлагаю самостоятельно
Решается, но через четыре вложенных селекта. Не то чтобы прямо отлично
Придется, в любом случае. Работает оно очень не быстро
С телефона сижу на бегу, но разве тут вариант с комбинацией case и lead/lag по оконным функциям не сработает?
Может и можно. Теперь бы понять, как сделать, чтобы еще и быстро работало.
и правда интересная задачка)) накидал вариант, вроде рабочий - https://sqlize.online/sql/psql14/b878a35a3fe18f6bc92b54dc6cda177c/
https://sqlize.online/sql/psql14/c15b1c72407434217d35337d583e6ace/
Обсуждают сегодня