2012-10-17 11 views
16

संभव डुप्लिकेट:एसक्यूएल का चयन अधिकतम (तारीख) और इसी मूल्य

SELECT TrainingID, Max(CompletedDate) as CompletedDate, Max(Notes) as Notes  --This will only return the longest notes entry 
FROM HR_EmployeeTrainings ET 
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) 
GROUP BY AvantiRecID, TrainingID    

है कौन सा:
How to get the record of a table who contains the maximum value?

मैं निम्नलिखित की तरह एक समग्र क्वेरी मिल गया है काम कर रहा है, और ज्यादातर समय सही डेटा देता है, लेकिन मैंने एक समस्या देखी। नोट्स फ़ील्ड जो लौटाया जाता है, वह रिकॉर्ड से मेल नहीं खाएगा कि अधिकतम (पूर्णडेट) है। इसके बजाय यह सबसे लंबी स्ट्रिंग वाला होगा? या उच्चतम ASCII मूल्य वाला एक? एसक्यूएल सर्वर दो रिकॉर्ड के बीच टाई की स्थिति में क्या करता है? मुझे भी यकीन नहीं है। जो मैं प्राप्त करना चाहता हूं वह अधिकतम (पूर्णडेट) रिकॉर्ड से नोट फ़ील्ड है। मुझे ऐसा करने के बारे में कैसे जाना चाहिए?

+0

पूरा हो गया है डेटटाइम नहीं? – Frobzig

+0

यह एक डेटटाइम है। उस क्षेत्र के साथ कोई समस्या नहीं है, लेकिन नोट्स के साथ। – MAW74656

+0

अधिकतम नोट्स या 'अधिकतम (पूर्ण दिनांक)' के लिए प्रत्येक नोट? – Marc

उत्तर

23

आप एक सबक्वेरी उपयोग कर सकते हैं। सबक्वायरी को Max(CompletedDate) मिलेगा। तब आप उस तारीख के साथ टिप्पणी सहयोगी पुनः प्राप्त करने के लिए इस मान लेते हैं और अपनी मेज पर शामिल होने के लिए फिर से:

select ET1.TrainingID, 
    ET1.CompletedDate, 
    ET1.Notes 
from HR_EmployeeTrainings ET1 
inner join 
(
    select Max(CompletedDate) CompletedDate, TrainingID 
    from HR_EmployeeTrainings 
    --where AvantiRecID IS NULL OR AvantiRecID = @avantiRecID 
    group by TrainingID 
) ET2 
    on ET1.TrainingID = ET2.TrainingID 
    and ET1.CompletedDate = ET2.CompletedDate 
where ET1.AvantiRecID IS NULL OR ET1.AvantiRecID = @avantiRecID 
3

यह करने के लिए कोई आसान तरीका नहीं है, लेकिन कुछ इस तरह काम करेगा:

SELECT ET.TrainingID, 
    ET.CompletedDate, 
    ET.Notes 
FROM 
HR_EmployeeTrainings ET 
inner join 
(
    select TrainingID, Max(CompletedDate) as CompletedDate 
    FROM HR_EmployeeTrainings 
    WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) 
    GROUP BY AvantiRecID, TrainingID 
) ET2 
    on ET.TrainingID = ET2.TrainingID 
    and ET.CompletedDate = ET2.CompletedDate 
+0

आप अपने सबक्वायरी के लिए वाक्यविन्यास गलत है, तो आप 'FROM' खंड खो रहे हैं। – Taryn

3

प्रत्येक मैक्स समारोह व्यक्तिगत रूप से मूल्यांकन किया जाता है। तो MAX (CompletedDate) नवीनतम पूर्णडेटेड कॉलम का मान वापस कर देगा और MAX (नोट्स) अधिकतम (यानी वर्णमाला उच्चतम) मान वापस कर देगा।

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

How to find the record in a table that contains the maximum value?

Finding the record with maximum value in SQL

+1

यदि प्रश्न का उत्तर कई बार पहले दिया गया है, तो सही काम करने के लिए "सटीक डुप्लिकेट" – Tony

+0

Thx के रूप में बंद करने के लिए मतदान करना है, मैंने अब यह किया है। – Marplesoft

5

आह हाँ, कि यह कैसे एसक्यूएल में करना है है। आप प्रत्येक कॉलम का अधिकतम हिस्सा प्राप्त करते हैं। ऐसा लगता है कि आप अधिकतम तिथि के साथ पंक्ति से मूल्य वापस करना चाहते हैं, इसलिए आपको अधिकतम तिथि के साथ पंक्ति का चयन करना होगा। मैं इसे उप-चयन के साथ करना पसंद करता हूं, क्योंकि प्रश्नों को पढ़ने के लिए कॉम्पैक्ट आसान रहता है।

SELECT TrainingID, CompletedDate, Notes 
FROM HR_EmployeeTrainings ET 
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) 
AND CompletedDate in 
    (Select Max(CompletedDate) from HR_EmployeeTrainings B 
    where B.TrainingID = ET.TrainingID) 

यदि आप एंटीआरसीआईडी ​​द्वारा भी मिलान करना चाहते हैं तो आपको उप-चयन में भी शामिल करना चाहिए।

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