2012-04-30 27 views
5

हो सकता है मेरे पास एक SQL सर्वर तालिका AccountAction है जो denormalised है। यह Account और Action तालिकाओं का एक चौड़ा संस्करण है, जो मुझे उम्मीद है कि लाखों पंक्तियों पर रिपोर्टिंग के लिए बहुत तेज़ होना चाहिए। एक Account कई Actions हो सकता है, तो तालिका के समान दिखता है:एसक्यूएल डीबी से खातों की एक्स संख्या प्राप्त करने के लिए, जो पंक्तियों की चर संख्या

Account  Action 
account1 action1 
account1 action2 
account1 action10 
account2 action5 

हालांकि मैं जानकारी एक साधारण संग्रहीत प्रक्रिया में किसी प्रतिबंधित सबसेट के लिए वापस हो रही है कुछ समस्या हो रही है।

select Account, Action 
from AccountAction 
where ??? 

जो मैं ढूंढ रहा हूं वह है कि वह अपने सभी कार्यों के साथ पहले एक्स खाते प्राप्त करें। तो यह पंक्तियों की एक गतिशील संख्या होगी। तो यदि मैं 1 में पारित हुआ तो उपर्युक्त उदाहरण तालिका का उपयोग करके, मुझे 3 पंक्तियां मिलेंगी (यानी मुझे पहले खाते के लिए सभी पंक्तियां दें)।

(मुझे कोई आपत्ति नहीं है कि खाते का नाम प्रत्येक पंक्ति में होगा - इसे कहीं और पिवट किए है)

मैं पंक्तियों को प्रतिबंधित करने के एक ROWNUM या इसी तरह का उपयोग करने की आवश्यकता है? मुझे यकीन है कि यह अब तक की तुलना में यह एक आसान मुद्दा होना चाहिए।

संपादित

टॉप का उपयोग कर काम नहीं करेगा, उदाहरण मैं चाहता होगी अगर मैं ने कहा 'मुझे एक (प्रथम) खाते दे' 3 पंक्तियों लौटे में जवाब। लेकिन मुझे कैसे पता चलेगा कि 3 होगा? इसकी गतिशील इसके अलावा वे अनुक्रमिक नहीं हो सकते हैं, तो क्या होगा यदि खाते 1 का एक्शन 99 परिणाम में 55 मिलियन स्थान पर था।

उत्तर

4
WITH 
    SequencedData 
AS 
(
    SELECT 
    DENSE_RANK() OVER (ORDER BY Account) AS account_sequence_id, 
    * 
    FROM 
    AccountAction 
) 
SELECT 
    * 
FROM 
    SequenceData 
WHERE 
    account_sequence_id = ??? 
का उपयोग

या, गुणकों के लिए ...

WHERE 
    account_sequence_id BETWEEN 3 AND 5 -- For the 3rd, 4th and 5th accounts. 
+0

यह अच्छा लगता है, हालांकि प्रदर्शन के बारे में क्या उदाहरण के लिए 100 मीटर पंक्तियां? इसे पहले हर पंक्ति पर रैंक करना होगा? – finoutlook

+1

@finoutlook - यह निर्भर करता है। * वास्तव में * आवश्यक है कि 'खाता' ऑर्डर में डेटा होना चाहिए। एक बार आदेश देने के बाद, ऑप्टिमाइज़र सिर्फ उस के 'एनएचएच' उदाहरण की तलाश कर सकता है। तो, क्या आपके पास पहले से ही 'खाता' के साथ पहले से ही एक इंडेक्स है? यदि ऐसा है, तो डेटा पहले से ही आदेश दिया गया है और आप केवल रिकॉर्ड्स की न्यूनतम संख्या को संसाधित कर रहे हैं। यदि नहीं, तो एक जोड़ें;) – MatBailie

+0

कूल, मैंने उन्हें पूर्व-आदेश देने का विचार नहीं किया था। मैं डी-सामान्यीकृत तालिका में सिंक के हिस्से के रूप में ऐसा कर सकता था। – finoutlook

0

अगर मैं सवाल सही मिला तो अगर यू प्रारंभिक चयन करना चाहते हैं 10 पंक्तियों तो

SELECT TOP 10 Account, Action 
FROM AccountAction 

या यू तो कुछ प्रारंभिक 20 प्रतिशत रिकॉर्ड चाहते हैं, तो use-

SELECT TOP 10 PERCENT Account, Action 
FROM AccountAction 
+0

ओपी 'Nth' खाता है, जहां प्रत्येक खाते का एक अलग संख्या हो सकती है चाहता है प्रत्येक रिकॉर्ड करता है। – MatBailie

0

क्या आपने टॉप की कोशिश की?

declare @hoW_many int 
set @hoW_many = 10 

select top (@hoW_many) * 
from AccountAction 
+0

स्थापित कर दूंगा ओपी 'पहली एन पंक्तियों' नहीं चाहता है, ओपी 'एनएच खाता' चाहता है, जहां प्रत्येक खाते में पंक्तियों की एक अलग संख्या होती है। – MatBailie

1
SELECT * 
FROM AccountAction 
WHERE account IN (SELECT account 
    FROM AccountAction 
    GROUP BY account HAVING account BETWEEN *start-account* AND *end-account* 
    ORDER BY account 
) 

स्पष्टीकरण: अलग खातों के द्वारा सबक्वेरी समूहों (और एक साधारण DISTINCT की तुलना में अधिक सुक्ष्म चयन मानदंड के लिए अनुमति देता है) और केवल उन्ही खातों देता है। बाहरी चयन आपको सबक्वायरी द्वारा प्राप्त किए गए अलग-अलग खातों के आधार पर पंक्तियों की एक चर संख्या प्राप्त करता है।

संपादित करें: उपर्युक्त मानता है कि account फ़ील्ड AccountAction तालिका में फ़िल्टर कर सकता है; यह आम तौर पर तालिकाओं में होता है जो M:N डीबी स्तर पर संबंध में शामिल हो जाते हैं।

+2

'LIMIT' एक SQL-Server फ़ंक्शन नहीं है। – GarethD

+0

@GarethD धन्यवाद पहले 'LIMIT' के समान प्रभाव के साथ' TOP' का उपयोग करने के लिए मेरे कोड को अपडेट किया गया। –

+0

एलआईटी से टॉप में परिवर्तन पोस्ट करें - क्या ओपी को तीसरी, चौथी और 5 वीं की आवश्यकता है? जब आप यह परिवर्तन भी करेंगे तो मैं +1 कर दूंगा :) – MatBailie

0

एक साधारण उप चयन top कीवर्ड के साथ (और विशिष्ट), तो आपको पहले एक्स के लिए सभी कार्यों देना होगा खातों

select * from AccountAction 
where Account in 
(select distinct top (@NumberOfAccounts) Account 
from AccountAction order by Account) 
+1

आपको उप-क्वेरी में ऑर्डर की आवश्यकता है अन्य परिणाम निष्पादन से निष्पादन में भिन्न हो सकते हैं। फिर यह आपके पहले 6 मिनट से जोसविज़ ज़ैमिट के जवाब जैसा ही है * (जहां डिस्टिंट और ग्रुप बाय इंटरचेंज योग्य हैं) *। – MatBailie

+0

@Dems - उत्तर में शामिल करने के लिए संशोधित उत्तर; लेकिन मेरा इरादा एक डुप्लिकेट जवाब शामिल नहीं था ... –

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