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

Здравствуйте! Есть поле stock - признак наличия товара, которое хранит значение

"Y" и "N". Нужно рассчитать поле DOOS, в котором хранятся данные о количестве дней не в наличии. Счетчик нужно сбрасывать каждый раз когда товар появляется в наличии.
Подскажите, как рассчитать это поле?

Пример исходной таблицы:
https://sqlize.online/sql/psql14/b387bc1a07a6938783dd929d4f13bd55/

27 ответов

22 просмотра

Сравнивать текущую дату с датой последнего обновления поля если на поле был 0. 20.01.2020 товар закочился, значение стало 0. 22.01.2020 товар завезли. Запрос видит, что предыдущее значение было 0 и добавляет к DOOS разницу в днях. CASE WHEN в апдейт встроить и будет работать

Евгений Симонов
А можно пример запроса?

UPDATE table SET doos=doos+(Сегодня-прошлая дата)*(stock!='Y'), stock='Y' Я не помню какими функциями брать чисельно разницу дат в днях, но такого в инете хватает. Даже CASE WHEN не надо

Oleksandr Danylenko
UPDATE table SET doos=doos+(Сегодня-прошлая дата)*...

эти непонятные операции такие некрасивые. Лучше описать всё адекватно, а не как я городить забор с сравнениями внутри присвоения

Евгений-Симонов Автор вопроса

Реализовал счетчик через row_number(). https://sqlize.online/sql/psql14/71a978a320dd1818e401b0ee94110aed/ Как учитывать дни, для которых не было записей?

Евгений Симонов
screenshot Реализовал счетчик через row_number(). https://sq...

Я бы через джойн на generate_series (или выделенный в отдельную таблицу календарь) сделала, чтобы получить полные наборы дат. Типа джойн по условию с даты последнего появления товара до текущей даты. Хотя не уверена, что правильно поняла, что требуется получить в итоге.

Блин, интересная задача. Я б на чистом sql решил, но раньше пн вечером не смогу сесть

Евгений Симонов
screenshot Реализовал счетчик через row_number(). https://sq...

Раз уж вы пошли в оконные функции, то тогда делайте математику через first_value(), т.е. что-то типа date - (first_value(date) OVER …) только вам надо распарсить даты из строк

Kamoliddin Nabijonov
через оконные функции с order by по date

Через оконные функции там надо хитрее — объединить через PARTITION BY строки в группы с последней где ещё пока было в наличии (включительно) по последнюю где ещё пока не было (тоже включительно).

Andrey Novikov
Через оконные функции там надо хитрее — объединить...

Лень сейчас разбираться в задаче. По первому взгляду сразу понятно что задача отлично решается через оконки

Евгений-Симонов Автор вопроса
Andrey Novikov
Раз уж вы пошли в оконные функции, то тогда делайт...

date - first_value(date) - это круто. Благодарю! А не через оконные как можно реализовать?

Евгений Симонов
screenshot Реализовал счетчик через row_number(). https://sq...

Доработал ваше решение (завернув ещё в пару select'ов): https://sqlize.online/sql/psql14/e832f9d96d599e6d49a8cdbe6fae1ffe/ Получилось страшно, конечно, было бы интересно увидеть решение попроще и поэлегантней. А так угарная задача, я увеселился, спасибо.

Евгений-Симонов Автор вопроса
Евгений-Симонов Автор вопроса
Andrey Novikov
Доработал ваше решение (завернув ещё в пару select...

Так и задумано, что первый день имеет нулевой doos?

Евгений Симонов
screenshot Так и задумано, что первый день имеет нулевой doo...

Нет, для этих дней он по хорошему должен быть null, т.к. нет предыдущей записи с stock = 'Y'.

Евгений Симонов
screenshot Так и задумано, что первый день имеет нулевой doo...

Дополировать решение, чтобы не считать этот doos когда batch is null я вам уже предлагаю самостоятельно

Kamoliddin Nabijonov
Лень сейчас разбираться в задаче. По первому взгля...

Решается, но через четыре вложенных селекта. Не то чтобы прямо отлично

Евгений-Симонов Автор вопроса
Andrey Novikov
Дополировать решение, чтобы не считать этот doos к...

Придется, в любом случае. Работает оно очень не быстро

Евгений Симонов
screenshot Реализовал счетчик через row_number(). https://sq...

С телефона сижу на бегу, но разве тут вариант с комбинацией case и lead/lag по оконным функциям не сработает?

Евгений-Симонов Автор вопроса
V K
С телефона сижу на бегу, но разве тут вариант с ко...

Может и можно. Теперь бы понять, как сделать, чтобы еще и быстро работало.

Евгений Симонов
Может и можно. Теперь бы понять, как сделать, чтоб...

и правда интересная задачка)) накидал вариант, вроде рабочий - https://sqlize.online/sql/psql14/b878a35a3fe18f6bc92b54dc6cda177c/

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта