2012-11-29 21 views
10

में खुद को तालिका में शामिल होने और अधिकतम मान चुनने के लिए मैं एक contracts तालिका है:कैसे एसक्यूएल

contractId date  price  partId 
1    20120121 10  1 
2    20110130 9   1 
3    20130101 15  2 
4    20110101 20  2 

सबसे बड़ी date सक्रिय अनुबंध होने के साथ अनुबंध (मुझे दोष नहीं है, मैं सूचनाओं xpps बनाने के लिए दोषी ठहराते हैं)

मुझे केवल सक्रिय अनुबंध देखने के लिए क्वेरी बनाने की आवश्यकता है (प्रति भाग एक अनुबंध, उच्चतम तारीख वाला अनुबंध)।

तो क्वेरी के परिणाम इस तरह होना चाहिए:

contractId date  price  partId 
1    20120121 10  1 
3    20130101 15  2 

मैं यहाँ विचारों से बाहर हूँ, मैं स्वयं करने की कोशिश की तालिका में शामिल होने, मैं एकत्रीकरण कार्यों की कोशिश की, लेकिन मैं इसे समझ नहीं कर सकते हैं। किसी को भी किसी भी विचार के लिए होता है, तो उन्हें मेरे साथ साझा करें ..

+1

क्या RDBMS MySql या SQL-सर्वर की तरह प्रयोग कर रहे हैं? –

+1

'query' सिर्फ एक ही 'आर' के साथ ठीक है ... –

+1

मुझे उस गलती के लिए खेद है, मैं इस querry को समझने की कोशिश कर रहे टेलनेट एमुलेटर के सामने पूरे दिन थोड़ा थका हुआ हूँ .. मैं उपयोग कर रहा हूँ आईबीएम एएस/400 पर डीबी/2। –

उत्तर

16

इस लगभग सभी RDBMS,

SELECT a.* 
FROM tableName A 
     INNER JOIN 
     (
      SELECT partID, MAX(date) maxDate 
      FROM tableName 
      GROUP BY partID 
     ) B on a.partID = b.partID AND 
       a.date = b.maxDate 

अपने आरडीबीएमएस Window Function समर्थन करता है तो,

पर काम करेंगे
SELECT contractId ,date, price,partId 
FROM  
(
    SELECT contractId ,date, price,partId, 
      ROW_NUMBER() OVER (PARTITION BY PartID 
           ORDER BY date DESC) rn 
    FROM tableName 
) s 
WHERE rn = 1 
+0

पूरी तरह से काम करता है, आपको बहुत धन्यवाद श्रीमान! –

3
SELECT c.* 
FROM contracts c 
    INNER JOIN 
    (
     SELECT partId, MAX([date]) AS MaxDate 
     FROM contracts 
     GROUP BY partID 
    ) MaxDate 
     ON c.partId = MaxDate.partID 
      AND c.[date] = MaxDate.[date]