2012-09-26 34 views
6

Tengo dos tablas, una es una lista de tareas. El otro contiene valores históricos para esas tareas.SQL Server: fecha máxima y unión interna

necesito para generar una lista del último evento (y su descripción) por cada cheque, siempre, siempre y cuando su Date_Executed es menor que la fecha y hora actual menos los Timeframe (TimeFrame siendo hora dentro de la tarea que hay que hacer , formateado para usar en DATEADD). Pero solo si tienen un active = 1.

Tabla: cheques

Check_id description TimeFrame active 
1   Task One  -24  0 
2   Task Two  -24  0 
3   Task Forty -48  1 
4   Task Somehin -128  1 

Tabla: eventos

Event_id Check_id Comment  Date_Executed    User_Executed 
1   1   NULL  2012-09-18 16:10:44.917 admin 
2   1   NULL  2012-09-25 11:39:01.000 jeff 
3   4   Failed  2012-09-25 13:20:09.930 steve 
4   4   Half failed 2012-09-25 13:05:09.953 marsha 
5   2   NULL  2012-09-25 14:02:24.000 marsha 
6   3   NULL  2012-09-18 16:10:55.023 marsha 

las mejores soluciones que tengo hasta ahora es:

SELECT 
    a.[Date_Executed] 
    a.[Check_id], 
    a.[Comments], 
    b.[frequency], 
    b.[Check_id], 
    b.[description]  
FROM 
    [checksdb].[dbo].events as a, 
    [checksdb].[dbo].checks as b 
where 
    b.active = 1 
    and a.[Date_Executed] < = dateadd(HOUR,b.[frequency],GETDATE()) 
    and a.Check_id = b.Check_id 
order by Check_id, priority 

y

select MAX(date_Executed), Task_id from daily_check_events group by Task_id 

Ninguno de los cuales me da lo que necesito, realmente podría necesitar ayuda.

+3

Además de las consultas que ha intentado que no le dan los resultados que desea, se puede mostrar los resultados que desea? Además, [deje de usar la sintaxis 'FROM table_a, table_b'] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins .aspx). –

Respuesta

8

Dado que usted es SQL Server que admite Common Table Expression y Window Function. Prueba de esto,

WITH latestEvents 
AS 
(
    SELECT Event_id, Check_id, [Comment], Date_Executed, User_Executed, 
      ROW_NUMBER() OVER(PARTITION BY Check_ID ORDER BY DATE_Executed DESC) 
       AS RowNum 
    FROM events 
) 
SELECT a.[Check_id], a.[description], 
     b.[Date_Executed], b.[Comment] 
FROM checks a 
     INNER JOIN latestEvents b 
      on a.check_ID = b.check_ID 
WHERE b.RowNum = 1 AND 
     a.active = 1 
     -- other conditions here 

SQLFiddle Demo

La consulta anterior sólo funcionará en RDBMS que apoya Window Functions. Como alternativa, utilice la siguiente consulta que funciona en la mayoría de los RDBMS

SELECT a.Check_id, a.description, 
     c.Date_Executed, c.Comment 
FROM checks a 
     INNER JOIN 
     (
      SELECT check_id, MAX(Date_Executed) maxExecuted 
      FROM events 
      GROUP BY check_ID 
     ) b ON a.check_ID = b.check_ID 
     INNER JOIN events c 
      ON c.check_ID = b.check_ID AND 
      c.date_executed = b.maxExecuted 
WHERE a.active = 1 

SQLFiddle Demo

+0

Gracias por eso. Terminé usando la versión de 'Common Table Expression'. (Lo siento por la respuesta tardía, tuve que probar exhaustivamente). – flammable