Найти ошибку в коде SQL
Решаю задачу:
В базе существует таблица с заказами (orders). В таблице следующий набор полей:
id - идентификатор заказа
customer_id - идентификатор покупателя
order_total - общая сумма заказа
product_id - идентификатор продукта
order_date - дата заказа
amount - количество единиц заказа
У каждого заказа определите разницу суммы заказа с суммой предыдущего (поле diff_lag) и следующего (поле diff_lead) заказа (ранжируем по сумме заказа от меньшего к большему). Рассчет должен вестись в рамках клиента по возрастанию айди заказа (поля id). То есть сначала все заказы пользователя с customer_id = 1 с id заказа по возрастанию, потом все заказы пользователя 2 с айди заказа по возрастанию и т.д.
В итоговой выборке должны быть поля customer_id, id, order_total, diff_lag, diff_lead.
Замечание: если у пользователя есть несколько заказов на одну и ту же сумму, для таких заказов поля diff_lead должны совпадать. Аналогичная ситуация с diff_lag.
В качестве решения написал код:
SELECT
t1.customer_id,
t1.id,
t1.order_total,
t2.diff_lag,
t2.diff_lead
FROM orders t1
inner join
(
SELECT
order_total,
order_total - lag(order_total) OVER(PARTITION BY customer_id ORDER BY order_total) AS diff_lag,
lead(order_total) OVER(PARTITION BY customer_id ORDER BY order_total)- order_total AS diff_lead
from
(select distinct order_total, customer_id
from orders) t1
) t2
on t1.order_total = t2.order_total
order by id
Но результат неверный - в строках таблицы 6, 7, 8 и 11 дублипуется id, причем дубль с неверным результатом
Прошу помочь разобраться и исправить код.
Ответы (1 шт):
Итак, задачу решил со сторонней подсказкой, выкладываю правильный код:
SELECT t1.customer_id,t1.id,t1.order_total,t2.diff_lag,t2.diff_lead
FROM orders t1
JOIN
(SELECT customer_id,order_total,
order_total-lag(order_total) OVER(PARTITION BY customer_id ORDER BY order_total) AS diff_lag,
lead(order_total) OVER(PARTITION BY customer_id ORDER BY order_total)-order_total AS diff_lead
FROM orders
GROUP BY customer_id,order_total) t2 ON t2.customer_id=t1.customer_id AND t2.order_total=t1.order_total
ORDER BY t1.id