2009-06-16 18 views
10

द्वारा एक समूह के भीतर शीर्ष एन पंक्तियों का चयन करना मैं निम्न के समान स्कीमा है:खंड

create table bar 
(
    instrument varchar(255) not null, 
    bar_dttm datetime not null, 
    bar_open int not null, 
    bar_close int not null 
) 

मैं तालिका क्वेरी, और साधन प्रति सबसे हाल ही में 5 पंक्तियों को वापस करना चाहते हैं।

मैं इसे साधन द्वारा साधन कर सकते हैं, के साथ:

select top 5 instrument, bar_dttm, bar_open, bar_close 
from bar 
where instrument = 'XXX' 
order by bar_dttm desc 

मैं एक क्वेरी में एक बार में सभी उपकरणों के लिए ऐसा करना चाहते हैं। क्या यह संभव है? मैं एसक्यूएल सर्वर चला रहा हूँ 2008

+0

एसक्यूएल सर्वर का कौन सा संस्करण? –

+0

एसक्यूएल सर्वर 2008 - प्रश्न में जोड़ा गया। – Jon

उत्तर

12

क्रॉस लागू है कि कैसे आप आमतौर पर ऐसा करते हैं - http://msdn.microsoft.com/en-us/library/ms175156.aspx

संपादित करें - उदाहरण के लिए, कुछ इस तरह जोड़ें:

select 
    bar1.instrument 
    ,bar2.* 
from (
    select distinct instrument from bar) as bar1 
cross apply (
    select top 5 
     bar2.instrument 
     ,bar2.bar_dttm 
     ,bar2.bar_open 
     ,bar2.bar_close 
    from bar as bar2 where bar2.instrument = bar1.instrument) as bar2 

आमतौर पर आप द्वारा एक आदेश जोड़ना चाहते हैं वहाँ पर।

संपादित करें - क्वेरी में विशिष्ट जोड़ा गया है, उम्मीद है कि आप चाहते हैं कि आप चाहते हैं। संपादित करें - शीर्ष पर जोड़ा गया 'चयन' कीवर्ड जोड़ा गया। कॉपी & पेस्ट बग एफटीएल!

+0

यह मेरे लिए काम नहीं करता प्रतीत होता है। मुझे कई डुप्लिकेट पंक्तियां मिलती हैं क्योंकि मुझे लगता है कि बार तालिका में प्रत्येक पंक्ति पर लागू हो रहा है? – Jon

+0

@jon - oops, कोई परीक्षण डेटा आसान नहीं था इसलिए मैं लिखी गई क्वेरी को सत्यापित नहीं कर सका। शायद सबकुछ एक subquery में bar1.instrument पर एक अलग करना है। मैं उदाहरण अपडेट करूंगा। – ahains

+0

@ हैनस्टेक अभी ठीक काम करता है, लेकिन आप शीर्ष पर एक चयन खो रहे हैं। – Jon

7

एसक्यूएल 2008, आप एक CTE के साथ एक विभाजित पंक्ति संख्या खंड इस्तेमाल कर सकते हैं का उपयोग कर ...

with MyCte AS (SELECT  instrument, 
          bar_dttm, 
          bar_open, 
          bar_close, 
          PartitionedRowNum = ROW_NUMBER() OVER (PARTITION BY instrument ORDER BY bar_dttm DESC) 
       from  bar) 
select * 
from MyCte 
where PartitionedRowNum <= 5 
+0

यह अच्छी तरह से काम करता है। मेरी एक समस्या यह है कि मेरी बार तालिका काफी बड़ी है (लाखों पंक्तियां) और इसके लिए क्वेरी योजना पूरी तालिका को सॉर्ट करने लगती है। क्या इसे अनुकूलित करने का कोई तरीका है? शीर्ष '5' पंक्तियां तालिका के एक छोटे प्रतिशत (<1%) का प्रतिनिधित्व करती हैं। – Jon