2016-08-15 4 views
0

に対応するいくつかのデータを取得します。また、ORGは1:Nの関係でHISTORYにリンクされています。 各人のテーブルORGから1行だけを取得したい:これは、日付が最も高いHISTORY行に対応する。次のSQLは、特定の人物にとって最高の日付を示します。しかし、これを上記の要件と組み合わせる方法はわかりません。Iは、これらの3つのテーブルを持っている最大の日付

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

データベースに応じて、これには複数の方法があります。しかし、あなたのデータ構造は厄介です。 orgにはなぜhistoryidがあるのですか?それは本当に私にとって意味をなさない。いずれの場合においても

、あなたの説明に基づいて、この作業をする必要があります:

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) 
関連する問題