





SELECT order_id,
LEAD(order_id) OVER(PARTITION BY Customer_id ORDER BY Order_date) AS next_order
FROM tab
ORDER BY order_id;
Демонстрация DBFiddle - MySQL 8.0
Для предыдущей версии MySQL:
SELECT order_id,
(SELECT order_id
FROM tab t2
WHERE t1.customer_id = t2.customer_id
and t2.Order_date > t1.order_date
ORDER BY Order_date LIMIT 1 ) AS next_order
FROM tab t1
ORDER BY order_id;
Оконные функции избавляют от всего удовольствия :-(
Вы также можете subquery:
SELECT order_id,
(select order_id
from table
where Customer_id = t.Customer_id and
Order_date > t.Order_date
order by Order_date
LIMIT 1) as next_order_id
FROM table t
ORDER BY order_id;
Каноническим способом в MySQL был бы коррелированный подзапрос:
select t.*,
(select t2.order_id
from t t2
where t2.customer_id = t.customer_id and t2.order_date > t.order_date
order by t2.order_date desc
limit 1
) as next_order_id
from t;
Если вы используете MySQL 8.0, lead() - лучший выбор.
Что будет "next_order_id" для order_id: 3 и 4 ??? NULL или что-то еще