एसक्यूएल सबसे हाल की तारीख से पंक्तियों का चयन करता है


106

निम्नलिखित क्वेरी और परिणामों का उपयोग करते हुए, मैं सबसे हालिया प्रविष्टि की तलाश कर रहा हूं जहां ChargeId और ChargeType अद्वितीय हैं।

select chargeId, chargeType, serviceMonth from invoice

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008
3   101     R       2/1/2008
4   101     R       3/1/2008
5   101     R       4/1/2008
6   101     R       5/1/2008
7   101     R       6/1/2008
8   101     R       7/1/2008

चाहा हे:

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008

जवाबों:


147

आप एक प्रकार से और आइटम द्वारा समूह आइटम के लिए एक समूह BY का उपयोग कर सकते हैं । तब आप सबसे हाल के सेवा महीने को पाने के लिए MAX () एग्रीगेट फ़ंक्शन का उपयोग कर सकते हैं । नीचे ChargeId, ChargeType और MostRecentServiceMonth के साथ सेट किया गया परिणाम देता है

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE

1
यदि आपको इसे डाउनस्ट्रीम की आवश्यकता है तो मैक्स (सर्विसमार्ट) क्षेत्र को अन्य नाम देना न भूलें।
बेन हॉफस्टीन

2
ठीक है, तो क्या होता है अगर तालिका में एक पंक्ति 101 एन 1/1/2008 है?
tvanfosson

3
आपको एक अतिरिक्त पंक्ति वापस मिल जाएगी। जो उसकी आवश्यकताओं के आधार पर वांछित परिणाम है।
कार्लटन जेनके

1
पोस्ट में क्वेरी में अन्य नाम जोड़े गए। tvanfosson - यह एक सशर्त होगा जो परिणाम सेट में जोड़ा जाता है, जो सही है।
मिचेल सेलर्स

1
अगर मैं इसके साथ रिकॉर्ड आईडी भी खींचना चाहता था। मुझे यह कैसे करना है?
डोनी वी।

58

तो यह वह नहीं है जो आवश्यककर्ता के लिए पूछ रहा था, लेकिन यह "सबसे हाल की तारीख से पंक्तियों का चयन एसक्यूएल" का जवाब है।

Http://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Row से संशोधित

SELECT t.chargeId, t.chargeType, t.serviceMonth FROM( 
    SELECT chargeId,MAX(serviceMonth) AS serviceMonth
    FROM invoice
    GROUP BY chargeId) x 
    JOIN invoice t ON x.chargeId =t.chargeId
    AND x.serviceMonth = t.serviceMonth

2
धन्यवाद! यह वही है जिसे मैं देख रहा था!
डायना

विचारों के साथ संगत प्रतीत नहीं होता है।
नाज़ोलिलो


6

मुझे लगता है कि अधिकांश डेवलपर्स इनलाइन क्वेरी का उपयोग करते हैं, बिना यह देखे कि यह विशाल डेटा पर प्रभाव डालता है।

सरल तरीके से आप इसे प्राप्त कर सकते हैं:

select a.chargeId, a.chargeType, a.serviceMonth 
from invoice a
left outer join invoice b
on a.chargeId=b.chargeId and a.serviceMonth <b.serviceMonth 
where b.chargeId is null
order by a.serviceMonth desc

1
select to.chargeid,t0.po,i.chargetype from invoice i
inner join
(select chargeid,max(servicemonth)po from invoice 
group by chargeid)t0
on i.chargeid=t0.chargeid

उपरोक्त क्वेरी काम करेगी यदि अलग-अलग चार्ज आईडी में अलग-अलग चार्जगाइप संयोजन हैं। इस सरल क्वेरी को विचार में थोड़ा प्रदर्शन समय के साथ मदद मिलती है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.