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


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

¿Cómo obtengo el actual JobStatus para todos los trabajos?Unirse al registro de la fecha MAX en el grupo

así que algo como ....

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

(estoy seguro de que hay un montón de preguntas similares ya, pero no pude encontrar nada que hace exactamente lo que necesito).

+0

Posible duplicado de [T-SQL Subconsulta Max (Fecha) y se une a] (http: // stackoverflow .com/questions/879111/t-sql-subquery-maxdate-and-joins) – KyleMit

Respuesta

33

En 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 

En 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 
     ) 

Estas consultas manejan posibles duplicados en Date correctamente.

+0

¡Cómo me he estado perdiendo desde 2005! Gracias por la respuesta :) – nokturnal

6

Una forma es la siguiente:

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 

Suponiendo que no tendrá 2 filas en JobStatus para el mismo ID de Tarea + Fecha combinación

+0

Estaba un poco tarde ... – cjk

+0

@ck - ditto ... –

2

Otra solución (no es muy eficiente, pero fácil de entender) para SQL Server 2000: -

SELECT * 
FROM job j 
WHERE j.date = (SELECT MAX(date) 
        FROM job 
        WHERE id = j.id) 
Cuestiones relacionadas