带聚合函数的子查询

Sub query with aggregate function

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

按照之前 post 的示例,我尝试了以下查询:

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

但是,查询 return 2257 条记录,而它应该 return 2050 条记录。显然,我的查询完全按照写的那样进行,但不是我们想要的(笑)。

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

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

请帮我正确查询。

非常感谢。

克里斯

这是您的查询:

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

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

你要的是关联子查询,不是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
                   );

如果原始 table 有重复项,您可能仍会得到 2,050 多行。但这可能会解决你的问题。