2016-06-15 9 views
-4

私のデータベースには3つのテーブルがあります。 1つはApps用、もう1つはアプリの状態の歴史のため、もう1つは各状態の説明付きのテーブルです。グループの最後のエントリを取得するSQL

表アプリ:歴史

ID Name 
1 App1 
2 App2 

表:

ID IDApp IDState DateChanged 
1 1  2  2016-06-01 
2 1  4  2016-06-07 
3 2  1  2016-06-05 
4 2  2  2016-06-12 

表の状態:

ID Description 
1 Open 
2 Working 
3 Pending 
4 Closed 

私は、各アプリケーションの最後の状態を返すクエリをしたいです。複数の可能な状態は、単一の日に指定したアプリを目撃があることができればあなたのDateChangedフィールドの日付/時刻フィールドを作る考慮しなければならない

Name Description Date 
App1 Closed   2016-06-07 
App2 Working  2016-06-12 
+2

これはあなたの望みですが、あなたの質問は何ですか?これまでに何をしていますか? –

+0

私はそれを持っています:select apps.name、state.description、historic.DateChange from apps INNER JOIN歴史的なON apps.Id =歴史的.IdApp INNER JOIN州ON歴史的.IdApp = state.Id私は各アプリケーションの最後を望んでいると私はそれを行う方法がわからない – Pedro

答えて

-1
SELECT Name, Description, MAX(DateChanged) from Apps 
INNER JOIN Historic ON Apps.ID=Historic.IDapp 
INNER JOIN State ON State.ID=Historic.IDState 
GROUP BY Name, Description 
+0

そのクエリでは、戻り値はすべての行です。私は、各アプリの歴史的なテーブルの最新のエントリだけが必要です。 – Pedro

+0

アプリごとに1行しか受け取らなくてはなりません – Pedro

0

:私はこのようなリターンを求めています。これは動作するはずですが、ある日の特定のアプリケーションの状態報告は、履歴で報告された最新の日に特定のアプリケーションで目撃されたステータスが1を超える場合、最高のIDを持つステータスを任意に選択します。

SELECT a.Name, 
    COALESCE(s.Description, '(No History)') as Description, 
    h.DateChanged as Date 
FROM Apps a LEFT JOIN (
    SELECT IDApp, 
     MAX(IDState) as IDState, -- arbitrary tie breaker for > 1 state in a day 
     DateChanged 
    FROM Historic h1 INNER JOIN (
     SELECT IDApp, MAX(DateChanged) as MaxDateChanged 
     FROM Historic 
     GROUP BY IDApp 
    ) h2 ON h1.IDApp = h2.IDApp 
     AND h1.DateChanged = h2.MaxDateChanged 
    GROUP BY IDApp, DateChanged 
) h ON a.ID = h.IDApp 
LEFT JOIN State s ON s.ID = h.IDState 
関連する問題