2011-01-31 89 views
21
Job 
-------- 
Id 
Description 


JobStatus 
---------- 
Id 
JobId 
StatusTypeId 
Date 

すべてのジョブに対して最新のJobStatusを取得するにはどうすればよいですか?グループ内の最大日付レコードへの参加

ので、何かのような....

SELECT * FROM Job j 
INNER JOIN (/* Select rows with MAX(Date) grouped by JobId */) s 
    ON j.Id = s.JobId 

(私は同様の質問の束が既に存在していると確信しているが、私はまさに私が必要なものは何もありませんを見つけることができませんでした)。

+0

の可能性のある重複した[T-SQLサブクエリマックス(日)と参加](のhttp:// stackoverflowの.com/questions/879111/t-sql-subquery-maxdate-and-joins) – KyleMit

答えて

33

ためとJobStatusで2行を持っていないだろうと仮定し

SELECT j.*, s2.StatusTypeId, s2.Date 
FROM Job j 
    JOIN 
    (
     SELECT JobId, MAX(Date) AS LatestStatusDate 
     FROM JobStatus 
     GROUP BY JobId 
    ) s1 ON j.JobId = s1.JobId 
    JOIN JobStatus s2 ON s1.JobId = s2.JobId AND s1.LatestStatusDate = s2.Date 

SELECT * 
FROM job j 
LEFT JOIN 
     jobstatus js 
ON  js.id = 
     (
     SELECT TOP 1 id 
     FROM jobstatus jsi 
     WHERE jsi.jobid = j.jobid 
     ORDER BY 
       jsi.date DESC 
     ) 

これらのクエリは、Dateの可能な重複を正しく処理します。

+0

2005年以来これをどのように逃してしまったのですか?答えをありがとう:) – nokturnal

6

一つの方法はこれです:SQL Server 2000

SELECT * 
FROM job j 
OUTER APPLY 
     (
     SELECT TOP 1 * 
     FROM jobstatus js 
     WHERE js.jobid = j.jobid 
     ORDER BY 
       js.date DESC 
     ) js 

:あなたが同じのJobId +日の組み合わせSQL Server 2005+

+0

私はちょっと遅すぎました... – cjk

+0

@ck - ditto ... –

2

別(非常に効率的ではなく、理解することは簡単ではありません)SQL Server用のソリューション:2000 -

SELECT * 
FROM job j 
WHERE j.date = (SELECT MAX(date) 
        FROM job 
        WHERE id = j.id) 
関連する問題