0

我正在尝试使用以下查询加入两个表。

(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

但我得到以下错误:

查询错误:错误:ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“as t1 INNER JOIN (SELECT CustomerName, MAX(OrderDate) as Latest_Order_date”附近使用正确的语法

db小提琴

4

3 回答 3

1

您缺少一个外部选择子句:

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;

如果在您的联接中传递的每一行都匹配一个且唯一的记录,这将是正确的。

UNION请注意,如果子查询之间的内容不是连接,那么您当前的语法实际上在 MySQL 上是有效的。也就是说,以下是有效的语法:

(SELECT CustomerName, OrderDate FROM Table1)
UNION
(SELECT CustomerName, OrderDate FROM Table1)
于 2019-02-05T06:01:08.113 回答
1

您需要添加一个部分,例如

SELECT t1.CustomerName, t1.Previous_Order_Date, t2.Latest_Order_date
  FROM

对于查询的上述部分:

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
于 2019-02-05T06:02:04.603 回答
0

您没有主要的选择语句。

尝试类似:

SELECT *
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

MySQL select 需要以下格式的查询:

SELECT *
FROM table1 AS t1
JOIN table2 AS t2
  ON t1.id = t2.id
JOIN (SELECT id, value FROM table3) as t3
  on t3.id = t2.id
WHERE t3.value IS NOT NULL;
于 2019-02-05T06:05:15.473 回答