2008-09-01 8 views
6

मैं अपने वास्तविक जीवन की समस्या को हल करने के विभिन्न तरीकों को ढूंढना चाहता हूं: एक प्रतियोगिता या गेम खेलने की कल्पना करें, जिसके दौरान उपयोगकर्ता एकत्र करते हैं अंक। आपको सर्वोत्तम "एन" स्कोर वाले उपयोगकर्ताओं की सूची दिखाने के लिए एक क्वेरी बनाना है।एसक्यूएल क्वेरी सूची में से शीर्ष "एन" स्कोर प्राप्त करने के लिए

मैं स्पष्ट करने के लिए एक उदाहरण बना रहा हूं। मान लें कि इस उपयोगकर्ता तालिका में है, अंक अर्जित किए साथ:

UserId - Points 
1  - 100 
2  - 75 
3  - 50 
4  - 50 
5  - 50 
6  - 25 

अगर मैं शीर्ष 3 स्कोर चाहते हैं, परिणाम होगा:

UserId - Points 
1  - 100 
2  - 75 
3  - 50 
4  - 50 
5  - 50 

यह एक दृश्य या एक में महसूस किया जा सकता संग्रहीत प्रक्रिया, जैसा आप चाहते हैं। मेरा लक्ष्य डीबी एसक्यूएल सर्वर है। दरअसल मैंने इसे हल किया, लेकिन मुझे लगता है कि परिणाम प्राप्त करने के लिए अलग-अलग तरीके हैं ... मेरे से तेज़ या अधिक प्रभावशाली।

उत्तर

9

untested है, लेकिन काम करना चाहिए:

select * from users where points in 
(select distinct top 3 points from users order by points desc) 
1

@bosnic, मुझे नहीं लगता कि के रूप में अनुरोध काम करेंगे है, मुझे लगता है कि एमएस एसक्यूएल के साथ परिचित नहीं हूँ लेकिन मैं इसे सिर्फ 3 पंक्तियों को वापस करने के लिए उम्मीद करेंगे , और इस तथ्य को अनदेखा करें कि 3 उपयोगकर्ता तीसरे स्थान पर बंधे हैं।

कुछ इस तरह काम करना चाहिए:

select userid, points 
    from scores 
    where points in (select top 3 points 
         from scores 
         order by points desc) 
    order by points desc 
0

वास्तविकता की जांच करने के लिए धन्यवाद @Espo - उप चयन उस के लिए सही करने के लिए जोड़ा गया।

मुझे लगता है कि सबसे आसान प्रतिक्रिया है:

select userid, points from users 
where points in (select distinct top N points from users order by points desc) 

आगे रहने के लिए है कि एक संग्रहीत proc जो एक पैरामीटर के रूप एन लेता है, तो में चाहते हैं तो आप या तो एक चर में एसक्यूएल पढ़ा करना होगा फिर इसे निष्पादित या पंक्ति संख्या चाल कार्य करें:

declare @SQL nvarchar(2000) 
set @SQL = "select userID, points from users " 
set @SQL = @SQL + " where points in (select distinct top " + @N 
set @SQL = @SQL + " points from users order by points desc)" 

execute @SQL 

या

SELECT UserID, Points 
FROM  (SELECT ROW_NUMBER() OVER (ORDER BY points DESC) 
     AS Row, UserID, Points FROM Users) 
     AS usersWithPoints 
WHERE Row between 0 and @N 

दोनों उदाहरण SQL सर्वर मानते हैं और परीक्षण नहीं किए गए हैं।

0

@ रोब # 37760:

select top N points from users order by points desc 

इस क्वेरी केवल 3 पंक्तियों का चयन करेंगे, तो एन 3 है, प्रश्न देखें। "शीर्ष 3" 5 पंक्तियों को वापस करना चाहिए।

1

कैसे के बारे में:

select top 3 with ties points 
from scores 
order by points desc 

सुनिश्चित नहीं हैं कि अगर "संबंधों के साथ" और कुछ एसक्यूएल सर्वर पर काम करता है।

SQL सर्वर 2005 पर और ऊपर, आप एक पूर्णांक पैरामीटर के रूप में "टॉप" संख्या पारित कर सकते हैं:

select top (@n) with ties points 
from scores 
order by points desc 
4

यहाँ एक है कि काम करता है - अगर यह और अधिक कुशल है मैं नहीं जानता, और यह एसक्यूएल सर्वर है 2005+

with scores as (
    select 1 userid, 100 points 
    union select 2, 75 
    union select 3, 50 
    union select 4, 50 
    union select 5, 50 
    union select 6, 25 
), 
results as (
    select userid, points, RANK() over (order by points desc) as ranking 
    from scores 
) 
select userid, points, ranking 
from results 
where ranking <= 3 

जाहिर है पहली "के साथ", मूल्यों की स्थापना के लिए, ताकि आप के साथ दूसरे और अंतिम चयन काम का परीक्षण कर सकते है - आप पर "परिणामों के साथ के रूप में ..." शुरू कर सकता है यदि आप थे मौजूदा तालिका के खिलाफ पूछताछ।

+0

मेरे पास एक समान समस्या है और MAX का उपयोग करने की कोशिश कर रहा था और फिर मैंने आपका पढ़ा जवाब दें और याद रखें DENSE_RANK। मुझे बहुत समय बचाया। – DataGirl

0

@Matt हैमिल्टन

आपका जवाब ऊपर के उदाहरण के साथ काम करता है, लेकिन अगर डेटा सेट 100, 75, 75, 50, 50 था (जहां यह केवल 3 पंक्तियों वापसी होगी) काम नहीं होगा। टाईज़ के साथ शीर्ष में केवल अंतिम पंक्ति के संबंध शामिल हैं ...

0

क्रूसिबल को यह मिला (मान लीजिए कि एसक्यूएल 2005 एक विकल्प है)।

0

असल में एक प्रवेश जो इनरर जॉइन का उपयोग कर रहा है, बहुत तेज होगा।

SELECT 
    userid, points 
FROM users u 
INNER JOIN 
(
    SELECT DISTINCT TOP N 
     points 
    FROM users 
    ORDER BY points DESC 
) AS p ON p.points = u.points 
0

इस

select top N points from users order by points desc 
0

अरे मैंने पाया सभी अन्य उत्तर लंबे और अक्षम सा मेरा जवाब होगा प्रयास करें:

select * from users order by points desc limit 0,5

इस प्रस्तुत करना होगा शीर्ष 5 बिंदुओं

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