2009-06-26 6 views
45

मैं अपनी प्रोजेक्ट टीम के लिए स्टेटस बोर्ड मॉड्यूल बना रहा हूं। स्टेटस बोर्ड उपयोगकर्ता को अपनी स्थिति को अंदर या बाहर सेट करने की अनुमति देता है और वे एक नोट भी प्रदान कर सकते हैं। मैं एक एकल तालिका में सभी जानकारी संग्रहीत करने पर योजना बना रहा था ... और डेटा के उदाहरण इस प्रकार है:सबसे हालिया रिकॉर्ड पुनर्प्राप्त करने के लिए एक SQL क्वेरी बनाएँ

Date    User   Status Notes 
------------------------------------------------------- 
1/8/2009 12:00pm B.Sisko  In  Out to lunch  
1/8/2009 8:00am B.Sisko  In 
1/7/2009 5:00pm B.Sisko  In  
1/7/2009 8:00am B.Sisko  In  
1/7/2009 8:00am K.Janeway In 
1/5/2009 8:00am K.Janeway In  
1/1/2009 8:00am J.Picard  Out  Vacation 

मैं डेटा क्वेरी और प्रत्येक उपयोगकर्ता के लिए सबसे हाल ही में स्थिति लौटाने, इस मामले में चाहते हैं,

Date    User   Status Notes 
------------------------------------------------------- 
1/8/2009 12:00pm B.Sisko  In  Out to lunch  
1/7/2009 8:00am K.Janeway In 
1/1/2009 8:00am J.Picard  Out  Vacation 

मैं कारोबार- SQL ऐसा करने के लिए यह पता लगाने की कोशिश कर रहा हूँ: मेरी क्वेरी निम्न परिणाम वापसी होगी? किसी भी सहायता की सराहना की जाएगी।

+2

Hahaha ... स्टारफ़्लीट timesheet। –

उत्तर

63

सबक्वायरी व्युत्पन्न तालिका में कुल मिलाकर इसके साथ जुड़ें।

Select Date, User, Status, Notes 
    from [SOMETABLE] 
    inner join 
    (
     Select max(Date) as LatestDate, [User] 
     from [SOMETABLE] 
     Group by User 
    ) SubMax 
    on [SOMETABLE].Date = SubMax.LatestDate 
    and [SOMETABLE].User = SubMax.User 
+4

इसे व्युत्पन्न तालिका कहा जाता है। – SurroundedByFish

+0

पूरी तरह से काम करता है :-) – Fox

+5

सावधान रहें यदि व्युत्पन्न तालिका {नवीनतम दिनांक, उपयोगकर्ता} – alphadogg

41

एक और तरीका है, इस तालिका में केवल एक बार के बजाय दो बार स्कैन करेगा अगर आप एक सबक्वेरी

केवल SQL सर्वर 2005 और ऊपर

select Date, User, Status, Notes 
from (
     select m.*, row_number() over (partition by user order by Date desc) as rn 
     from [SOMETABLE] m 
    ) m2 
where m2.rn = 1; 
+0

मैजिक, मैं 3 टेबल में शामिल होने और इस कोड के आधार पर प्रत्येक प्रकार के लिए केवल नवीनतम प्रविष्टि का चयन करने में मुश्किल क्वेरी को हल करने में सक्षम था । धन्यवाद! – Sopuli

+1

यह निष्पादन योजना में स्वीकार्य उत्तर के समान लागत है, लेकिन जब आपको कई कॉलम द्वारा समूहबद्ध करने की आवश्यकता होती है उदाहरण के लिए orgID, महीना, वर्ष, यह उत्तर semantically cleaner है। – gooddadmike

+0

यह यादृच्छिक रूप से आदेश के अनुसार पहले सभी रिकॉर्ड के रिकॉर्ड को यादृच्छिक रूप से चुनता है। –

7

ली गई तालिका काम करेगा का उपयोग करें, लेकिन अगर इस एसक्यूएल 2005, एक CTE और ROW_NUMBER क्लीनर हो सकता है:

WITH UserStatus (User, Date, Status, Notes, Ord) 
as 
(
SELECT Date, User, Status, Notes, 
    ROW_NUMBER() OVER (PARTITION BY User ORDER BY Date DESC) 
FROM [SOMETABLE] 
) 

SELECT User, Date, Status, Notes from UserStatus where Ord = 1 

यह भी जिले में सुविधा होगी प्रत्येक उपयोगकर्ता से हालिया एक्स स्थितियों का खेल।

4

एक और आसान तरीका:

SELECT Date, User, Status, Notes 
FROM Test_Most_Recent 
WHERE Date in (SELECT MAX(Date) from Test_Most_Recent group by User) 
+3

क्या यह प्रश्न गलत नहीं होगा यदि दो उपयोगकर्ता एक ही समय में अपनी स्थिति अपडेट करते हैं, लेकिन उस समय उनमें से किसी के लिए नवीनतम गतिविधि नहीं है? – SooDesuNe

+0

महेश, आपको अपने उत्तर को @ SooDesuNe की टिप्पणी में ध्यान में रखना होगा। –

+0

यदि आप इसकी सहायता कर सकते हैं तो चयन खंडों में चयन का उपयोग न करें। जब तक कि यह एक बार की बात नहीं है, आपको देखने की जरूरत है। यदि यह एक संग्रहित प्रो में जा रहा है, तो यह परिणाम वापस करने के लिए समय बढ़ाता है। विशेष रूप से बड़ी टेबल पर। –

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