2016-06-15 5 views
-4

데이터베이스에 3 개의 테이블이 있습니다. 하나는 앱용이고 다른 하나는 앱 상태에 대한 역사적인 것이며 다른 하나는 각 주에 대한 설명이 포함 된 마지막 테이블입니다.그룹의 마지막 항목 가져 오기 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 

나는 각 응용 프로그램의 마지막 상태를 반환하는 쿼리를 원한다.

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

그래서 원하는 것이지만 무엇이 문제입니까? 또는 지금까지 무엇을 했습니까? –

+0

나는 그것을 가지고있다 : select apps.name, state.description, historic.DateChange 애플 리케이션으로부터 INNER JOIN 역사적인 ON apps.Id = historical.IdApp INNER JOIN state ON historical.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

각 앱마다 한 줄만 받아야합니다. – Pedro

0

여러 가능한 상태가 하루에 주어진 앱 목격있을 수 있습니다 경우 DateChanged 필드 날짜/시간 필드을 고려해야한다 :이 같은 반환합니다. 현재 상태 인 것으로 간주되지만 특정 날짜에 특정 앱에 대한 주보고는 가장 최근 ID가 가장 높은 상태에서 특정 앱에 대해 목격 한 상태가 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 
관련 문제