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


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

Jak uzyskać bieżący numer JobStatus dla wszystkich zadań?Dołączanie do rekordu daty maksymalnej w grupie

więc coś ....

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

(jestem pewien, że istnieje kilka podobnych pytań już, ale nie mogłem znaleźć niczego, co dokładnie robi to, co trzeba).

+0

Możliwy duplikat [T-SQL Podkwerenda Max (Date) i dołącza] (http: // stackoverflow .pl/questions/879111/t-sql-subquery-maxdate-and-joins) – KyleMit

Odpowiedz

33

W SQL Server 2005+:

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

W SQL Server 2000:

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 
     ) 

Te zapytania prawidłowo obsługują możliwe duplikaty na Date.

+0

Jak mi brakowało tego od 2005 roku! Dziękuję za odpowiedź :) – nokturnal

6

Jednym ze sposobów jest to:

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 

Zakładając, że nie będzie mieć 2 wiersze w JobStatus dla tego samego jobid + Data połączeniu

+0

Po prostu było już za późno ... – cjk

+0

@ck - ditto ... –

2

Innym (nie bardzo wydajny, ale łatwe do zrozumienia) rozwiązaniem dla SQL Server 2000: -

SELECT * 
FROM job j 
WHERE j.date = (SELECT MAX(date) 
        FROM job 
        WHERE id = j.id) 
Powiązane problemy