具有聚合函数的子查询

时间:2015-12-03 15:52:32

标签: mysql sql subquery max aggregate

我无法获得正确的记录。我的位置表记录了一台设备的位置历史记录。因此,最新的date_moved将是其当前位置。位置表当前包含2258条记录(“state_tag”是FK)。在我的设备表中,我有2050件设备,每个设备都有一个唯一的“state_tag”号码(PK)。所以,我想要的是查询位置表以获取所有设备的当前位置(即MAX(date_moved)。然后查询应返回2050条记​​录。

按照上一篇文章的示例,我尝试了以下查询:

SELECT * FROM its_locations WHERE date_moved in (SELECT MAX(date_moved) FROM its_locations GROUP BY state_tag);

但是,当应该返回2050条记​​录时,查询返回2257条记录。显然,我的查询完全按照书面编写,但不是想要的(lol)。

我还尝试了以下查询,它给了我2050条记​​录,但只返回了每组的第一条记录,并将该组的最大日期插入该记录中,该记录很可能不是其当前位置。

SELECT state_tag , MAX(date_moved) AS "Date Moved" , building , room , staff , comments FROM its_locations GROUP BY state_tag;

请帮我解决正确的问题。

非常感谢。

克里斯

1 个答案:

答案 0 :(得分:1)

这是您的查询:

SELECT *
FROM its_locations
WHERE date_moved in (SELECT MAX(date_moved) FROM its_locations GROUP BY state_tag)

子查询计算所有位置的最大date_moved。然后它返回具有这些日期的任何位置。因此,两个位置可能在同一个日期移动,一个是最大日期,并且都返回。

你想要的是一个相关的子查询,而不是group by

SELECT l.*
FROM its_locations l
WHERE date_moved = (SELECT MAX(l2.date_moved)
                    FROM its_locations l2
                    WHERE l2.state_tag = l.state_tag
                   );

如果原始表格有重复,您仍可能获得超过2,050行。但这可能会解决你的问题。