2009-04-29 10 views
6

मैं कॉलम में एक मान दिखाई देने की औसत संख्या का पता लगाने की कोशिश कर रहा हूं, इसे किसी दूसरे कॉलम पर आधारित करता हूं और उसके बाद गणना करता हूं।एसक्यूएल एवीजी (COUNT (*))?

मैं 3 टेबल इस

DVD 

ID | NAME 
1 | 1  
2 | 1  
3 | 2  
4 | 3 

COPY 

ID | DVDID 
1 | 1 
2 | 1 
3 | 2 
4 | 3 
5 | 1 

LOAN 

ID | DVDID | COPYID 
1 | 1  | 1 
2 | 1  | 2 
3 | 2  | 3  
4 | 3  | 4 
5 | 1  | 5 
6 | 1  | 5 
7 | 1  | 5 
8 | 1  | 2 

आदि

मूल रूप से की तरह एक छोटे से है, मैं सभी प्रतिलिपि आईडी कि ऋण तालिका में जाने की औसत संख्या की तुलना में कम बार दिखाई दे खोजने की कोशिश कर रहा हूँ उस डीवीडी की सभी प्रतियों के लिए।

तो ऊपर दिए गए उदाहरण में, डीवीडी 5 की प्रतिलिपि 1 बार 3 बार दिखाई देती है, दो बार प्रतिलिपि बनाएँ और 1 बार प्रतिलिपि करें ताकि उस डीवीडी के लिए औसत 2 हो। मैं उस (और एक दूसरे) डीवीडी की सभी प्रतियां सूचीबद्ध करना चाहता हूं जो कि ऋण तालिका में उस संख्या से कम दिखाई देता है।

मुझे आशा है कि थोड़ा अधिक समझ में आता है ...

धन्यवाद

+0

तो आपके उदाहरण में, डेटा परिणाम सेट का परिणाम क्या लौटाया जाना चाहिए? क्या यह डीवीडीआईडी ​​= 1 के लिए आउटपुट 2 और दूसरे दो के लिए 1 होना चाहिए? –

+1

... क्योंकि 'कॉलम में मूल्य की औसत संख्या की औसत संख्या' कहती है, इसका कोई अर्थ नहीं है। ऐसा लगता है कि यह कितनी बार प्रकट होता है; आप एक मूल्य औसत नहीं कर सकते हैं। –

+0

क्षमा करें, मैं आधा सो रहा हूँ! मेरा मतलब था कि मैं औसत तालिका को ढूंढना चाहता हूं कि प्रत्येक डीवीडी की प्रतियां लोन टेबल –

उत्तर

2

यह Oracle में काम करना चाहिए:

create view dvd_count_view 
select dvdid, count(1) as howmanytimes 
    from loans 
group by dvdid; 

select avg(howmanytimes) from dvd_count_view; 
2

untested है ...

with 
loan_copy_total as 
(
    select dvdid, copyid, count(*) as cnt 
    from loan 
    group by dvdid, copyid 
), 
loan_copy_avg as 
(
    select dvdid, avg(cnt) as copy_avg 
    from loan_copy_total 
    group by dvdid 
) 

select lct.*, lca.copy_avg 
from loan_copy_avg lca 
inner join loan_copy_total lct on lca.dvdid = lct.dvdid 
    and lct.cnt <= lca.copy_avg; 
2

के समान dotjoe का समाधान, लेकिन अतिरिक्त शामिल होने से बचने के लिए एक विश्लेषणात्मक कार्य का उपयोग करना। कम या ज्यादा कुशल हो सकता है।

with 
loan_copy_total as 
(
    select dvdid, copyid, count(*) as cnt 
    from loan 
    group by dvdid, copyid 
), 
loan_copy_avg as 
(
    select dvdid, copyid, cnt, avg(cnt) over (partition by dvdid) as copy_avg 
    from loan_copy_total 
) 

select * 
from loan_copy_avg lca 
where cnt <= copy_avg; 
+0

मैं हाल ही में इस 'वाक्य' वाक्य को देख रहा हूं। क्या यह मानक एसक्यूएल है या यह ओरेकल में है? –

+0

यह एएनएसआई एसक्यूएल मानक का हिस्सा है –

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