SQL

2011-12-15 9 views
5

में किसी अन्य कॉलम से किसी मान के बराबर या उसके बराबर मान के साथ पंक्तियों की संख्या की गणना करना मेरे पास दो कॉलम वाली एक तालिका है: कुछ आईडी और जोड़े के लिए "अंक" की संख्या। मुझे एक परिणाम चाहिए जो x के प्रत्येक मान के लिए x अंक या उससे अधिक जोड़ों की संख्या सूचीबद्ध करता है। तो मेरी इनपुट की तरह दिखता है:SQL

 
| couple_id | num_marks | 
|-----------+-----------| 
|   9 |   7 | 
|   6 |   6 | 
|   8 |   6 | 
|   2 |   5 | 
|   3 |   4 | 
|   5 |   4 | 
|   1 |   3 | 
|   4 |   3 | 
|  10 |   2 | 
|   7 |   1 | 

और मैं परिणाम प्राप्त करना चाहते हैं:

 
| num_marks | num_couples | 
|-----------+-------------| 
|   7 | 1   | 
|   6 | 3   | 
|   5 | 4   | 
|   4 | 6   | 
|   3 | 8   | 
|   2 | 9   | 
|   1 | 10   | 

अर्थात 7 या उससे अधिक अंक वाले 3 जोड़े, 6 या अधिक अंकों वाले 3 जोड़े, 4 5 या अधिक अंक वाले जोड़ों आदि। मैं पर एक प्रश्न के साथ आने में सक्षम हूं के साथ जोड़े की संख्या वापसn अंक:

SELECT num_marks, 
     count(couple_id) AS num_couples 
    FROM table_name 
    GROUP BY num_marks 
    ORDER BY num_marks DESC; 

कौन सा पैदावार:

 
| num_marks | num_couples | 
|-----------+-------------| 
|   7 |   1 | 
|   6 |   2 | 
|   5 |   1 | 
|   4 |   2 | 
|   3 |   2 | 
|   2 |   1 | 
|   1 |   1 | 

Ie 7 अंकों के साथ 1 जोड़े, 6 अंक वाले 2 जोड़े, 1 के साथ 1, इत्यादि। से ऊपर प्रत्येक पंक्ति के मूल्य को प्रभावी ढंग से करने के लिए प्रभावी तरीका है? मैं इसे एप्लिकेशन स्तर पर कर सकता हूं, लेकिन ऐसा लगता है कि जो वास्तव में डेटाबेस में संबंधित है।

उत्तर

5

यह विशेष रूप से कुशल नहीं हो सकता है, लेकिन काम करवाने चाहिए:

SELECT t1.num_marks,  
    (SELECT count(t2.couple_id) 
    FROM table_name t2 
    WHERE t2.num_marks >= t1.num_marks 
    ) AS num_couples 
FROM table_name t1 
GROUP BY t1.num_marks 
ORDER BY t1.num_marks DESC; 

संपादित करें: आप चयन में एक sub query उपयोग कर सकते हैं, से है, जहां, समूह द्वारा और एक प्रश्न के खंड होने , और यदि आप मुख्य/बाहरी 'क्वेरी' का संदर्भ देते हैं तो यह प्रत्येक पंक्ति के लिए सबक्वायरी का मूल्यांकन करेगा, फिर इसे correlated subquery के रूप में जाना जाता है। (इसलिए प्रदर्शन के बारे में चेतावनी)

डेमियन के उत्तर के अनुसार, आप सीटीई - सीटीई का उपयोग भी पठनीयता में सुधार कर सकते हैं और रिकर्सन और स्वयं को बहुत आसान आईएमओ में शामिल कर सकते हैं।

AFAIK subqueries अधिकांश SQL में समर्थित हैं।

+0

यह शानदार शानदार है! मुझे नहीं पता था कि आप 'चयन' कॉलम के रूप में हो सकते हैं। क्या वह मानक एसक्यूएल है जो उदा। SQLite और Postgres? साथ ही, मेरा 'table_name' वास्तव में एक तालिका नहीं है, यह अपने आप पर एक बड़ा' चुनौती 'है; क्या वह चीजें तोड़ देगा? – haxney

+1

@ हक्सनी - मैंने संपादित किया है - हां, आप table_name को किसी अन्य क्वेरी से बदल सकते हैं, इसे बाहरी चयन पर इसका उपयोग करने के लिए इसे उपनाम करने की आवश्यकता होगी। – StuartLC

4

आप, जहां प्रत्येक परिणाम में शुमार है बाहर काम करने के RANK() समारोह का उपयोग कर सकते तो सिर्फ इतना है कि पद पर बंधे परिणामों की संख्या जोड़ें:

create table #T (couple_id int,num_marks int) 
insert into #T (couple_id,num_marks) 
select 9 ,   7 union all 
select 6 ,   6 union all 
select 8 ,   6 union all 
select 2 ,   5 union all 
select 3 ,   4 union all 
select 5 ,   4 union all 
select 1 ,   3 union all 
select 4 ,   3 union all 
select 10 ,   2 union all 
select 7 ,   1 

;with Ranked as (
    select num_marks,RANK() OVER (ORDER BY num_marks desc) as rk from #T 
) 
select num_marks,rk + COUNT(*) -1 as Result from Ranked 
group by num_marks,rk 

देता है:

num_marks Result 
----------- -------------------- 
7   1 
6   3 
5   4 
4   6 
3   8 
2   9 
1   10 

(7 row(s) affected) 

(बेशक, यदि आपको किसी विशेष क्रम में परिणामों की आवश्यकता है, तो ORDER BY खंड जोड़ने के लिए मत भूलना - उपर्युक्त आदेश केवल एक ख़ुशी दुर्घटना है)