我无法获得正确的记录。我的位置表记录了一台设备的位置历史记录。因此,最新的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;
请帮我解决正确的问题。
非常感谢。
克里斯
答案 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行。但这可能会解决你的问题。