2016-08-15 4 views
0

dem maximalen Datum entspricht Ich habe diese drei Tabellen:einige Daten erhalten, die

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

Beide HISTORY und ORG sind verknüpft Person mit einer 1: N-Beziehung. Außerdem ist ORG mit HISTORY mit einer 1: N-Beziehung verknüpft. Ich möchte von Tabelle ORG für jede Person nur eine Zeile bekommen: das entspricht der HISTORY-Zeile mit dem höchsten Datum. Die folgende SQL gibt das höchste Datum für eine bestimmte Person an. Ich weiß jedoch nicht, wie ich das mit der obigen Anforderung kombinieren soll.

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

Tag Ihre Frage mit der Datenbank Sie verwenden. –

Antwort

0

Es gibt mehrere Möglichkeiten, dies zu erreichen, abhängig von der Datenbank. Ihre Datenstruktur ist jedoch peinlich. Warum hat orghistoryid? Das ergibt für mich keinen Sinn.

in jedem Fall auf der Grundlage Ihrer Beschreibung sollte diese Arbeit:

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 
       ); 

Sie könnten die from Klausel starten wollen:

from (select distinct personid from org) o 

So Sie nur eine Person erhalten, wenn Sie werden in der Tabelle wiederholt.

0

Ich glaube, Sie es mithilfe MAX() und GROUP BY tun können:

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

die unter Abfrage Versuchen ..

;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) 
Verwandte Themen