2016-08-15 59 views
0

一些數據我有這些3個表:獲取對應於最大日期

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

歷史和ORG被鏈接到人與一個1:N的關係。此外,ORG以1:N關係鏈接到HISTORY。 我想從表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

根據數據庫的不同,有多種方法可以解決這個問題。但是,您的數據結構很尷尬。爲什麼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 

所以,你只有一個人,如果他們在桌上重複。

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 
0

嘗試下面的查詢..

;WITH_CTE_HighestHistory 
AS (SELECT PersonID,MAX([Date]) HDate 
    FROM History 
    GROUP BY PersonID) 
SELECT org.*,h.* 
FROM org o 
    LEFT JOIN History h ON o.Historyid=h.Id and o.PersonID=h.PersonId 
    INNER JOIN WITH_CTE_HighestHistory ch ON h.Personid=ch.Personid and h.[Date]=ch.[Date] 
WHERE EXISTS(SELECT 1 FROM Person p WHERE p.Id=o.PersonID)