使用两个表仅列出最大日期

时间:2014-12-11 16:20:13

标签: sql postgresql

我有物品和校准表。一个项目可以有很多校准。我需要列出具有date_expired校准的项目,但只显示带有" MAX"的项目。 date_expired(巫婆是必须校准的日期)。意味着如果一个项目有2个校准,则仅列出具有MAX日期的项目。使用postgress和ruby。 我有类似的东西,不知道它是否存在更好的方式使用...

SELECT *, date_expired  
FROM   Items  
LEFT OUTER JOIN Calibrations    
ON   Calibrations.item_id = Items.id   
GROUP BY Items.id, calibrations.date_expired  
HAVING calibrations.date_expired ...  

如果你能帮助我,不知道MAX(date_expired)的介绍地点。 TKS

UPDATE
项目
身份证号码 1 AAA
2 BBB
3 CCC

校准
id item_id date_expired
1 1 2014/12/12
2 1 2015/12/12

结果
id name date_exired
1 AAA 2015/12/12

2 个答案:

答案 0 :(得分:0)

SELECT i.Id, MAX(c.date_expired )
FROM Items i 
LEFT OUTER JOIN Calibrations c ON I.id = C.item_id
GROUP BY Items.id

答案 1 :(得分:0)

这应该可以解决问题:

SELECT DISTINCT ON (i.id) 
    i.id, i.name, c.date_expired
FROM Items i
JOIN Calibrations c ON c.item_id = i.id
ORDER BY i.id, c.date_expired desc

使用JOIN而不是LEFT JOIN,您只能获得带校准的项目。然后DISTINCT ON过滤结果,为每个项目提供一次校准。由于它的选择基于订单,因此date_expired desc的排序始终为我们提供最新的校准。