2012-03-28 2 views
0

나는 세 개의 테이블과 이들로부터 다음 출력을 생성하는 쿼리를 가지고 있습니다. 각 필드에는 데모 목적으로 원의 테이블을 나타내는 문자가 앞에 붙습니다. 대신 가장 최근 데이터 만 포함 된 보고서입니다. 즉 MAX (EntryDate)와 함께 반환되는 행만 원하지만이를 수행하는 방법을 알 수는 없습니다. 나는 시도했다, HAVING, 집계 등,하지만 성공과 함께. 내 접근 방식이 잘못되었거나 구문 론적으로 뭔가 빠졌습니다.각각 최대 날짜가있는 그룹별로 레코드 선택

s.ID r.FirstID m.ID m.PartNum  m.Revision  r.EntryDate 
26  42   13  NULL   A    2012-03-25 15:32:00 
26  42   17  820044444  B    2012-03-27 09:48:00 
26  42   14  820056789  C    2012-03-28 12:19:00 

원하는 결과 : 약간의 추가 배경에 대한

s.ID r.FirstID m.ID m.PartNum  m.Revision  r.EntryDate 
26  42   14  820056789  C    2012-03-28 12:19:00 

는 r.FirstID 내가 단지를 반환 할 그래서 각각을 그룹화, 모두 서로 관련 기록의 그룹을 나타냅니다 가장 최근 데이터로 기록하십시오. 내 DBMS에 대한 SQL Server를 사용하고

select s.ID,r.FirstID,m.ID,m.PartNum,m.Revision,r.EntryDate from StatusLog s 
    left join (select FirstID,PartInfoID from Request where PartInfoID is not null group by FirstID,PartInfoID) r on s.FirstID= r.FirstID 
    --required filtering here? Or move this extra join to the inner query? 
    left join PartInfo m on r.PartInfoID = m.ID 

:

는 여기에 지금까지 가지고 내 쿼리입니다.

답변

1

가장 쉬운 방법은 ROW_NUMBER() (단순화를 위해 CTE을 사용하고 있습니다)입니다. 여기에 무슨 일이 일어 났는지 설명 해달라고 나를 부탁합니다.

WITH myCTE 
AS 
(
    SELECT s.ID AS sID, r.FirstID, m.ID AS mID, m.PartNum, m.Revision, 
     r.EntryDate, 
     ROW_NUMBER() OVER 
      (PARTITION BY r.FirstID ORDER BY r.EntryDate DESC) AS RowNumber 
    FROM StatusLog s 
     LEFT JOIN 
     (
      SELECT FirstID, PartInfoID 
      FROM Request 
      WHERE PartInfoID IS NOT NULL 
      GROUP BY FirstID,PartInfoID 
     ) AS r 
      ON s.FirstID= r.FirstID 
     LEFT JOIN PartInfo m 
      ON r.PartInfoID = m.ID 
) 
SELECT sID,FirstID,mID,PartNum,Revision,EntryDate 
FROM myCTE 
WHERE RowNumber = 1; 
+0

아니요,이 사례는 특정 케이스에서만 작동합니다. 내 질문을 다시 읽으십시오. 나는 핵심 요점을 과장했다. 결과 세트, ** r.FirstID' 필드에 의해 결정된대로 ** 각 그룹 **에 대해 한 행을 리턴해야합니다. – Chiramisu

+0

@Chiramisu OK, fixed :) ROW_NUMBER() GROUP BY에서 s.ID를 제거해야했습니다. 이것은 지금 작동해야합니다. 나는 또한 ORDER BY가 정확하지 않으므로 DESC로 변경했다. :) –

+0

'ROW_NUMBER() OVER (GROUP BY')를 사용할 수 없다고 생각합니다.'ROW_NUMBER() OVER (PARTITION BY') – Arion