Как составить SQL запрос?

Привет. Есть таблица по продажам товаров в магазинах, у некоторых записей отсутствует цена.
+---------+-------------+---------+----------+-------+
| year_id | week_number | good_id | owner_id | price |
+---------+-------------+---------+----------+-------+
| 2019    | 6           | 140629  | 2        | 199   |
+---------+-------------+---------+----------+-------+
| 2019    | 8           | 140629  | 2        | NULL  |
+---------+-------------+---------+----------+-------+
| 2017    | 40          | 137233  | 9        | 278   |
+---------+-------------+---------+----------+-------+
| 2017    | 35          | 137233  | 9        | NULL  |
+---------+-------------+---------+----------+-------+
| 2017    | 37          | 137233  | 9        | NULL  |
+---------+-------------+---------+----------+-------+

Хотелось бы заменить пропущенные значения по следующей схеме: установить значение цены таким же, как и у товара с этим артикулом (good_id) из этого же магазина (owner_id) но проданным по возможности в ближайшую к пропущенному значению дату, например:
+---------+-------------+---------+----------+-------+
| year_id | week_number | good_id | owner_id | price |
+---------+-------------+---------+----------+-------+
| 2019    | 6           | 140629  | 2        | 199   |
+---------+-------------+---------+----------+-------+
| 2019    | 8           | 140629  | 2        | 199   |
+---------+-------------+---------+----------+-------+
| 2017    | 40          | 137233  | 9        | 278   |
+---------+-------------+---------+----------+-------+
| 2017    | 35          | 137233  | 9        | 278   |
+---------+-------------+---------+----------+-------+
| 2017    | 37          | 137233  | 9        | 278   |
+---------+-------------+---------+----------+-------+

Пока составил что-то такое, но этот запрос содержаит взаимоисключающие условия, поэтому само собой не затрагивает строк
UPDATE dataset
SET price = p.price
FROM dataset AS p
WHERE good_id = p.good_id
AND owner_id = p.owner_id
AND price IS NULL
AND p.price IS NOT NULL;
GO
  • Вопрос задан
  • 173 просмотра
Решения вопроса 1
Alexeytur
@Alexeytur
UPDATE dataset d
SET d.price = 
   (SELECT TOP 1 price FROM dataset d1 WHERE 
    d.good_id=d1.good_id AND d.owner_id=d1.owner_id AND d1.price IS NOT NULL AND 
    d1.year_id<=d.year_id AND d1.week_number<=d.week_number 
    ORDER BY d1.year_id DESC, d1.week_number DESC)
WHERE d.price IS NULL


Правда этот запрос ищет ближайшую дату, меньшую пропущенной.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Для SQL всегда должна быть определённость: "по возможности в ближайшую" — должно стать "ближайшую". И что делать с товаром, если такой цены нет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы