2012-09-26 38 views
6

Tôi có hai bảng, một là một danh sách các nhiệm vụ. Phần còn lại chứa các giá trị lịch sử cho các tác vụ đó.SQL Server: ngày tối đa và tham gia bên trong

Tôi cần tạo danh sách sự kiện mới nhất (và mô tả sự kiện) cho từng séc, miễn là Date_Executed ít hơn giờ hiện tại trừ đi Timeframe (TimeFrame là giờ trong công việc phải được thực hiện , được định dạng để sử dụng trong DATEADD). Nhưng chỉ khi họ có active = 1.

Bảng: kiểm tra

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 

Bảng: sự kiện

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 

Các giải pháp tốt nhất mà tôi có cho đến nay là:

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 

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

Cả hai đều không nhận được những gì tôi cần, tôi thực sự có thể sử dụng một số trợ giúp.

+3

Ngoài các truy vấn bạn đã cố gắng mà không cung cấp cho bạn kết quả mong muốn, bạn có thể hiển thị các kết quả mong muốn? Ngoài ra, [vui lòng ngừng sử dụng 'FROM table_a, cú pháp table_b'] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins .aspx). –

Trả lời

8

Vì bạn là SQL Server hỗ trợ Common Table ExpressionWindow Function. Hãy thử điều này,

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

Các truy vấn trên sẽ chỉ làm việc trên RDBMS có hỗ trợ Window Functions. Ngoài ra, sử dụng truy vấn dưới đây mà làm việc trên hầu hết các 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

Cảm ơn vì điều đó. Tôi đã kết thúc bằng cách sử dụng phiên bản 'Bảng biểu hiện chung '. (Xin lỗi vì trả lời trễ, phải kiểm tra kỹ lưỡng.) – flammable

Các vấn đề liên quan