У вас отсутствует внешнее предложение select:
SELECT
t1.CustomerName,
t1.Previous_Order_Date,
t2.Latest_Order_date
FROM
(
SELECT CustomerName, OrderDate,
LAG(OrderDate,1) OVER(ORDER BY OrderDate DESC) AS Previous_Order_Date
FROM Table1
) AS t1
INNER JOIN
(
SELECT CustomerName, MAX(OrderDate) AS Latest_Order_date
FROM Table1
GROUP BY CustomerName
) AS t2
ON t1.CustomerName = t2.CustomerName AND t1.OrderDate = t2.Latest_Order_date;
Но на самом деле вы могли бы иметь возможность упростить ваш запрос, даже не используя никаких объединений:
SELECT
t.CustomerName,
t.Previous_Order_Date,
t.Latest_Order_date
FROM
(
SELECT CustomerName, OrderDate,
LAG(OrderDate,1) OVER(ORDER BY OrderDate DESC) AS Previous_Order_Date,
MAX(OrderDate) OVER (PARTITION BY CustomerName) AS Latest_Order_date
FROM Table1
) t
WHERE
t.Previous_Order_Date = t.Latest_Order_date;
Это было бы правильно, если бы каждая строка, прошедшая в вашем объединении, соответствовала одной-единственной записи.
Обратите внимание, что ваш текущий синтаксис действительно будет действителен в MySQL, если между подзапросами будет UNION
вместоприсоединиться.То есть следующий допустимый синтаксис:
(SELECT CustomerName, OrderDate FROM Table1)
UNION
(SELECT CustomerName, OrderDate FROM Table1)