【问题标题】:Sub query with aggregate function具有聚合功能的子查询
【发布时间】:2015-12-03 15:52:32
【问题描述】:

我无法获取正确的记录。我的位置表记录了一件设备的位置历史。因此,最新的 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 条记录。显然,我的查询完全按照书面要求执行,但不是按照要求执行的(大声笑)。

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

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

请帮助我正确查询。

非常感谢。

克里斯

【问题讨论】:

  • 你应该用你正在使用的数据库标记问题。

标签: mysql sql subquery max aggregate


【解决方案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 行。但这可能会解决您的问题。

【讨论】:

  • 谢谢戈登!我刚刚完成了一门“SQL 编程简介”课程,并且正在研究相关的子查询,但无法将我的想法整合到一个语句中。非常感谢。
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多