2010-06-25 10 views
6

का उपयोग कर तालिका से केवल एक अद्वितीय रिकॉर्ड का चयन कैसे करें मेरी तालिका में कई रिकॉर्ड हैं जिनमें एक ही सदस्य आईडी है। मैं केवल एक रिकॉर्ड का परिणाम देना चाहता हूं।विशिष्ट

select DISTINCT(MemberID) from AnnualFees; 

तो परिणाम आ जाएगा। लेकिन मैं अन्य कॉलम डेटा भी दिखाना चाहता हूं लेकिन जब मैं यह

select DISTINCT(MemberID),StartingDate,ExpiryDate,Amount from AnnualFees; 

समान सदस्य आईडी डेटा सहित सभी विवरण भी प्रदर्शित करते हैं।

कोई मेरी मदद कर सकता है।

+0

तो आप कैसे चुनना चाहते हैं कि सदस्य आईडी = 123 के लिए कई वार्षिक फीस पंक्तियों को प्रदर्शित किया जाना चाहिए? या आप बस किसी एक यादृच्छिक पंक्ति चाहते हैं? –

उत्तर

18

मान लिया जाये कि आप सिर्फ प्रत्येक memberid से आप यह कर सकते हैं के लिए यादृच्छिक पर किसी भी पंक्ति हैं:

select memberid, this, that, theother 
from 
(
select memberid, this, that, theother, 
     row_number() over (partition by memberid order by this) rn 
from annualfees 
) 
where rn = 1; 

आप memberid प्रति एक विशेष पंक्ति चाहता था, तो जैसे

select memberid, this, that, theother 
from 
(
select memberid, this, that, theother, 
     row_number() over (partition by memberid order by StartDate desc) rn 
from annualfees 
) 
where rn = 1; 
यदि यह आप काफी क्या जरूरत है
+0

आरई के प्रत्येक क्रमपरिवर्तन * के लिए एक पंक्ति वापस करेगा: आपकी अंतिम क्वेरी। क्या आपको पता है कि ओरेकल में मेरे उत्तर में संस्करण की तुलना में यह अधिक कुशल है या नहीं? –

+1

@ मार्टिन स्मिथ: एनालिटिक्स सॉल्यूशन (टोनीज़) डेटा पर एक ही पास करेगा जबकि आपका एक स्व-जॉइन जोड़ देगा (जो एक छोटा ओवरहेड हो सकता है लेकिन फिर भी काम जोड़ देगा)। ** सामान्य रूप से **, टोनी का समाधान अधिक कुशल होगा। –

+0

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

-3

डिस्टिंट सदस्य आईडी, प्रारंभ तिथि, समाप्ति तिथि, वार्षिक शुल्क से राशि का चयन करें;

निकालें paranthesis

+2

यह सदस्य आईडी, प्रारंभिक दिनांक, समाप्ति दिनांक और राशि – APC

3

आप जो डुप्लिकेट MemberIDs वाली पंक्तियों की किसी तरह से वापस जाने के लिए चयन करना होगा। यह सबसे बड़ी शुरुआत तिथि के साथ पंक्ति मिलेगा।

SELECT MemberID,StartingDate,ExpiryDate,Amount 
FROM AnnualFees af 
WHERE NOT EXISTS (
     SELECT * from AnnualFees af2 
     WHERE af2.MemberID = af.MemberID 
     AND af2.StartingDate > af.StartingDate) 
5

पता नहीं है, लेकिन आप DISTINCT के बजाय द्वारा समूह को देखने के लिए आवश्यकता हो सकती है ...

: हाल ही में StartDate के साथ एक तो आप इसे करने के लिए संशोधित कर सकते

यदि आप एक ही सदस्य आईडी के साथ कई रिकार्ड है, तो आप कैसे एक आप दूसरों से चाहते हैं की पहचान करने के exaclty निर्दिष्ट करने के लिए आवश्यकता हो सकती है

जैसे प्रत्येक member`s पिछले प्रारंभ दिनांक प्राप्त करने के लिए:

SELECT memberid, max(startingdate) 
FROM annualfees 
GROUP BY memberid 

लेकिन यदि आप जिस तरह से इस तरह का में एक रिकॉर्ड की पहचान करने के बल्कि अन्य स्तंभ प्रदर्शित की जरूरत है, मैं you may need to do some trickery like this लगता है ...

जैसे उप क्वेरी ऊपर अन्य शामिल होने के लिए शामिल होने के एक साथ चयन वांछित कॉलम:

SELECT subq.memid, subq.startdate, a.expirydate, a.amount 
FROM (
    SELECT memberid AS memid, max(startingdate) AS startdate 
    FROM annualfees 
    GROUP BY memberid) subq 
INNER JOIN annualfees a ON a.memberid = subq.memid 
       AND a.startingdate = subq.startdate 

शुरू से आखिर तक, यह भी दिखा डेटा तालिका (ओ/p पता लगाया था/"सेट सत्यापित करें" का उपयोग कर पकड़ लिया) ...

-- show all rows 
select * 
from annualfees 
order by memberid, startingdate 
MEMBERID    STARTINGDATE    EXPIRYDATE   AMOUNT    
---------------------- ------------------------- -------------------- -------------------- 
1      02-DEC-09     05-FEB-10   111     
1      25-JUN-10     25-JUN-11   222     
2      25-APR-10     25-JUN-13   333     

3 rows selected 

/
-- show one member`s data using max(startingdate) as selector. 
SELECT memberid, max(startingdate) 
    FROM annualfees 
    GROUP BY memberid 
MEMBERID    MAX(STARTINGDATE)   
---------------------- ------------------------- 
1      25-JUN-10     
2      25-APR-10     

2 rows selected 

/
-- show above data joined with the other columns. 
SELECT subq.memid, subq.startdate, a.expirydate, a.amount 
    FROM (
     SELECT memberid AS memid, max(startingdate) AS startdate 
     FROM annualfees 
     GROUP BY memberid) subq 
    INNER JOIN annualfees a ON a.memberid = subq.memid AND a.startingdate = subq.startdate 
MEMID     STARTDATE     EXPIRYDATE   AMOUNT    
---------------------- ------------------------- -------------------- -------------------- 
1      25-JUN-10     25-JUN-11   222     
2      25-APR-10     25-JUN-13   333     

2 rows selected 

/