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


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

में MAX दिनांक रिकॉर्ड में शामिल होने से मैं सभी नौकरियों के लिए वर्तमान JobStatus कैसे प्राप्त करूं?समूह

तो जैसे कुछ ....

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

(मुझे यकीन है कि पहले से ही इसी तरह के सवाल का एक समूह देखते हैं हूँ, लेकिन मैं कुछ भी नहीं मिला वास्तव में मैं क्या आवश्यकता है जो)।

+0

की संभावित डुप्लिकेट [T-SQL Subquery अधिकतम (तिथि) और शामिल] (http: // stackoverflow .com/प्रश्न/879,111/टी एसक्यूएल-सबक्वेरी-maxdate और जुड़ जाता है) – KyleMit

उत्तर

33

SQL Server 2005+ में के लिए JobStatus में 2 पंक्तियाँ नहीं होगा:

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

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 
     ) 

इन प्रश्नों को सही ढंग से Date पर संभावित डुप्लिकेट संभाल।

+0

मैं कैसे 2005 के बाद से यह गायब किया गया है! जवाब के लिए धन्यवाद :) – nokturnal

6

एक तरीका यह है:

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 

मान लिया जाये कि आप एक ही JobId + दिनांक संयोजन

+0

मैं बस थोड़ा बहुत देर हो चुकी थी ... – cjk

+0

@ck - डिट्टो ... –

2

एसक्यूएल सर्वर के लिए एक और है (बहुत कुशल है, लेकिन समझने में आसान नहीं) समाधान 2000: -

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