如何只选择联接表的最后一个日期行



我将表B加入A。表A有我想要检索的基本信息,还有唯一的ID。

表B为每个ID有多行,另一列为Date。现在我只想选择表B的最后一个日期并加入A。

我找到了SQL的MAX()函数,但它表示其他字段不在GROUP BY clause or an aggregation function中。

这是我的(简化(查询:

SELECT
MAX("B"."ENDDATE") AS FINALEND,
"A."ID",
"A"."COLOR",
"A"."MAKE",
"A"."WHEELS",
FROM "A"
JOIN "B" ON "A"."ID" = "B"."ID"

我的预期结果是每个ID都有一行,其中包含表a中的基本信息和表B中所有匹配行的最后日期。我现在的结果是B中每行都有多行。

我是否需要为任何其他列添加GROUP BY?或者我错过了什么?

感谢您的输入:(

在MySQL 8+上,我们可以在这里使用ROW_NUMBER

WITH cte AS (
SELECT a.*, b.ENDDATE,
ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY b.ENDDATE DESC) rn
FROM A a
INNER JOIN B b ON b.ID = a.ID
)
SELECT ID, COLOR, MAKE, WHEELS, ENDDATE AS FINALEND
FROM cte
WHERE rn = 1;

在早期版本的MySQL上,我们可以加入一个子查询,该子查询在B表中查找每个ID的最新记录:

SELECT a.ID, a.COLOR, a.MAKE, a.WHEELS, b1.ENDDATE AS FINALEND
FROM A a
INNER JOIN B b1 ON b1.ID = a.ID
INNER JOIN
(
SELECT ID, MAX(ENDDATE) AS MAXENDDATE
FROM B
GROUP BY ID
) b2
ON b2.ID = b1.ID AND b2.MAXENDDATE = b1.ENDDATE;

相关内容

最新更新