Войти Регистрация
Data base

48. Последняя обычная цена для каждой строки прайса

Сложная

В prices — история цен товара на складе: с даты start_date действует цена price_rub. Вид цены kind: R — обычная, P — промо. Пара (склад, товар, дата) уникальна.

Для каждой строки верните её поля и regular_price — цену последней R-строки того же товара на том же складе с датой не позже даты строки (для самой R-строки — её собственную цену). Если такой R-строки нет, regular_price — NULL.

Колонки: stock_id, prod_id, start_date, kind, price_rub, regular_price. Порядок — по stock_id, prod_id, start_date.

В работе: Расчёт глубины скидки в промо: от какой обычной цены считать «−20 %».

Таблицы

prices — история цен; ключа нет, уникальна тройка склад–товар–дата

КолонкаТипЧто значит
stock_idintсклад
prod_idintтовар
start_datedateцена действует с
kindchar(1)R — обычная, P — промо
price_rubnumericцена

Пример: данные

prices · 6 строк

stock_idprod_idstart_datekindprice_rub
112025-11-01R1000
112025-11-02P800
112025-11-03P700
112025-11-04R1100
112025-11-05P900
112025-11-06R1200

Ожидаемый ответ

stock_idprod_idstart_datekindprice_rubregular_price
112025-11-01R10001000
112025-11-02P8001000
112025-11-03P7001000
112025-11-04R11001100
112025-11-05P9001100
112025-11-06R12001200
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 4 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
stock_id, prod_id, start_date, kind, price_rub, regular_price
оконные функциипропуски и островаподзапросNULL

Источник: задача о последней цене (Postgres Professional, Хабр, 2021); кандидат пишет, что похожую давали в Ozon. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.