2012-09-26 12 views
6

मेरे पास दो टेबल हैं, एक कार्य की एक सूची है। दूसरे में उन कार्यों के लिए ऐतिहासिक मूल्य शामिल हैं।एसक्यूएल सर्वर: अधिकतम तिथि और आंतरिक शामिल

मैं एक (और इसके विवरण) प्रत्येक चेक के लिए नवीनतम घटना की सूची बनाने के लिए, जब तक कि लंबे समय के रूप में अपनी Date_Executed वर्तमान दिनांक शून्य से Timeframe (TimeFrame घंटे किया जा रहा से भी कम है काम के भीतर किया जा सकता है की जरूरत है , DATEADD में उपयोग के लिए स्वरूपित)। लेकिन केवल अगर उनके पास active = 1 है।

तालिका: चेकों

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 

तालिका: घटनाओं

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 

सबसे अच्छा समाधान मैं अब तक है:

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 

इनमें से कोई भी मुझे जो चाहिए वह मुझे प्राप्त नहीं करता है, मैं वास्तव में कुछ मदद का उपयोग कर सकता हूं।

+3

प्रश्नों आप की कोशिश की है कि आप इच्छित परिणाम नहीं देते के अलावा पर काम करता है, आप इच्छित परिणाम दिखा सकता है? साथ ही, [कृपया table_a से, table_b' वाक्यविन्यास का उपयोग करना बंद करें] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins .aspx)। –

उत्तर

8

जब से तुम SQL Server जो Common Table Expression और Window Function का समर्थन करता है कर रहे हैं। इस प्रयास करें,

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

ऊपर क्वेरी केवल आरडीबीएमएस कि Window Functions का समर्थन करता है पर काम करेंगे। वैकल्पिक रूप से, का उपयोग करें कि नीचे दिए गए क्वेरी सबसे आरडीबीएमएस

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

इसके लिए धन्यवाद। मैं 'सामान्य तालिका अभिव्यक्ति' संस्करण का उपयोग कर समाप्त हुआ। (देर से उत्तर के बारे में खेद है, पूरी तरह से परीक्षण करना था।) – flammable

संबंधित मुद्दे