我有一个看起来像这样的表,我想为每个loc_id获取最新的insp_date的ID(insp_id)。
create table insp (
insp_id int (10),
loc_id int (11),
insp_type varchar (150),
insp_date date ,
insp_active tinyint (2),
insp_created timestamp ,
insp_modified timestamp
);
我尝试了来自Select latest record in table (datetime field)和其他人的“IN”策略,但这给了我两倍,因为一个loc_id的最新日期可能是另一个的非最新日期:
SELECT insp_id, loc_id, insp_active, insp_date
FROM insp
WHERE insp_active = 1
AND insp_date IN(SELECT MAX(insp_date) FROM insp WHERE insp_active = 1 GROUP BY loc_id)
ORDER BY loc_id ASC, insp_date DESC;
我设置了一个SQL小提琴,但添加各种GROUP BY和MAX似乎没有得到它。我觉得我需要加入一个子查询或类似的东西,但目前还不确定。
http://sqlfiddle.com/#!2/f95e0/1
谢谢, 安德鲁
答案 0 :(得分:1)
执行join
和聚合:
select i.*
from insp i join
(select loc_id, max(isp_date) as maxid
from insp
group by loc_id
) lm
on i.loc_id = lm.loc_id and i.isp_date = lm.maxid;
如果对同一位置重复最长日期,您仍然可能存在重复的风险。
答案 1 :(得分:1)
您需要检索每个位置的MAX
日期,然后检索此日期的MAX
insp_id
查询1 :
SELECT insp.loc_id, max(insp.insp_id)
FROM insp
INNER JOIN
(SELECT loc_id, max(insp_date) as insp_date
FROM insp
WHERE insp_active = 1
GROUP BY loc_id) AS mdate ON mdate.loc_id = insp.loc_id AND
mdate.insp_date = insp.insp_date
WHERE insp_active = 1
GROUP BY insp.loc_id
<强> Results 强>:
| LOC_ID | MAX(INSP.INSP_ID) |
|--------|-------------------|
| 1 | 1 |
| 2 | 40 |
| 3 | 48 |
| 4 | 37 |
| 5 | 49 |
| 6 | 39 |
| 7 | 50 |
| 8 | 46 |
更新:
如果特定日期只有一个有效检查,并且这始终是最新的活动检查,您可以这样做:
SELECT insp.loc_id, insp.insp_id
FROM insp
INNER JOIN
(SELECT loc_id, max(insp_date) as insp_date
FROM insp
WHERE insp_active = 1
GROUP BY loc_id) AS mdate ON mdate.loc_id = insp.loc_id AND
mdate.insp_date = insp.insp_date
WHERE insp_active = 1
答案 2 :(得分:0)
SELECT insp_id
FROM insp
WHERE insp_active = 1
GROUP BY loc_id
ORDER BY insp_date DESC;
答案 3 :(得分:0)
子查询是最常见的解决方案,但我过去常常使用不太标准的东西,因为在MySQL允许嵌套之前就是这样:
select max(concat_ws('|', insp_date, insp_id)) as result, loc_id
from insp
group by loc_id;
你会得到类似的东西:
2014-01-01|12
2014-02-14|19
...
然后你显然需要在你的应用程序中拆分它。请注意,它具有特定的MySQL方言,性能不高,但嵌套查询不是(或至少不是)。