获取与最大日期对应的一些数据

时间:2016-08-15 12:17:06

标签: sql

我有这3张桌子:

Table ORG:
   Fields:historyid, personid
Table PERSON:
   Fields: id
Table HISTORY:
   Fields: id,date,personid

HISTORY和ORG都与具有1:N关系的PERSON相关联。此外,ORG与HISTORY相关联,具有1:N的关系。 我想从每个人的表ORG中获取一行:这对应于具有最高日期的HISTORY行。以下SQL给出了某个人的最高日期。但是,我不知道如何将其与上述要求结合起来。

SELECT ash1.id                  
FROM 
(SELECT * FROM history a WHERE  a.personid=person.id) ash1          
LEFT JOIN    
(SELECT * FROM history b WHERE  b.personid=person.id) ash2
ON ash1.personid=ash2.personid
AND ash1.date < ash2.date
WHERE ash2.date IS NULL

2 个答案:

答案 0 :(得分:0)

根据数据库的不同,有多种方法可以解决这个问题。但是,您的数据结构很尴尬。为什么orghistoryid?这对我来说并不合理。

在任何情况下,根据您的描述,这应该有效:

select o.*, h.*
from org o join
    history h
    on h.personid = o.personid
where h.date = (select max(h2.date)
                from history h2
                where h2.personid = h.personid
               );

您可能希望将from子句作为:

启动
from (select distinct personid from org) o

所以,如果他们在表格中重复,你只会得到一个人。

答案 1 :(得分:0)

我认为您可以使用MAX()GROUP BY

来实现
SELECT 
    o.historyid AS o_hist,
    o.personid AS o_per,
    h.id AS h_id,
    MAX(h.date) AS h_date,
    h.personid AS h_person
FROM
    org o
        LEFT JOIN
    person p ON p.id = o.personid
        LEFT JOIN
    history h ON h.id = o.historyid AND h.personid = p.id
GROUP BY o_per