Найти ошибку в коде 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 шт):

Автор решения: Andrey

Итак, задачу решил со сторонней подсказкой, выкладываю правильный код:

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

введите сюда описание изображения

→ Ссылка