2013-03-08 17 views
23

Satırı en düşük değere sahip bir SQL deyimi istiyorum. Ben point sütunda en az değere sahip kimlikleri nasıl seçerimSQL sorgusu, minimum değerle farklı satır seçmek için

id game point 
1 x  5 
1 z  4 
2 y  6 
3 x  2 
3 y  5 
3 z  8 

, oyun tarafından gruplandırılmış:

bu tabloyu düşünün? Şunun gibi:

id game point  
1 z  4 
2 y  6 
3 x  2 
+0

İstenilen sonucu elde etmek için aynı tabloya katılmanız gerekiyor. Sorguda aşağıdaki sorguyu kontrol edin. –

+4

Neden sonuçlarınızda 5 yerine oyun "y" puanı 6 olur? – billynoah

+1

OP yanıt vermediğinden, sadece "id tarafından gruplandırılmış" sormak istediğini ve hangi oyunun en düşük puanı aldığını gösterebileceğini varsayabilirim ... –

cevap

30

kullanın çalışacaktır:

Select tbl.* From TableName tbl 
Inner Join 
(
    Select Id,MIN(Point) MinPoint From TableName Group By Id 
)tbl1 
On tbl1.id=tbl.id 
Where tbl1.MinPoint=tbl.Point 
+0

Tam olarak ..! Teşekkür ederiz – balaji

+0

Microsoft Access'te bir SQL'de yazarken tek bir iç birleştirme yapılabilir mi? – KSM

+4

unneccessary complecation SELECT id, game, MIN (point) DİZDEN tabileame GROUP BY kimliği, oyun –

-3

Dene:

select id, game, min(point) from t 
group by id 
+1

Bu hatayı alıyorum "Column 'student.point' geçersiz HAVING yan tümcesinde bir toplama işlevi veya GROUP BY yan tümcesinde yer almadığı için " – balaji

+0

Şimdi deneyebilir misiniz?" – www

+0

aynı hata. MS SQL – balaji

10

Bu

select * from table 
where (id,point) IN (select id,min(point) from table group by id); 
+0

Hangi rdbms kullanıyorsunuz? – Aspirant

+0

MS SQL – balaji

+1

Ohh kullanıyorum! MySQL hakkında bilmiyorum ... Sorgu alt sorguda çoklu sütun denetimi Oracle'da çalışacaktır. – Aspirant

0

Ken Clark's answer benim durumumda işe yaramadı. Seninkilerde de çalışmayabilir. Bu sql sadece kullanıyor aşağıdaki ANSI SQL ile etiketlenmiş gibi

SELECT * 
from table T 

INNER JOIN 
    (
    select id, MIN(point) MinPoint 
    from table T 
    group by AccountId 
) NewT on T.id = NewT.id and T.point = NewT.MinPoint 

ORDER BY game desc 
0
SELECT * from room 
INNER JOIN 
    (
    select DISTINCT hotelNo, MIN(price) MinPrice 
    from room 
Group by hotelNo 
) NewT 
on room.hotelNo = NewT.hotelNo and room.price = NewT.MinPrice; 
+2

Bu kodun soruyu nasıl cevapladığına ilişkin kısa bir açıklama bu cevabı büyük ölçüde artıracaktır – jmoreno

7

ve window function: Değilse, bu deneyin

select id, game, point 
from (
    select id, game, point, 
     row_number() over (partition by game order by point) as rn 
    from games 
) t 
where rn = 1; 
8

Bu aynı şeyi yapmanın başka bir yoludur En iyi 5 kazanan oyunu seçmek gibi ilginç şeyler yapmanıza izin verir, vb.

SELECT * 
FROM 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Point) as RowNum, * 
    FROM Table 
) X 
WHERE RowNum = 1 

Şimdi, en düşük skoru olanı olarak tanımlanan gerçek satırı doğru şekilde alabilirsiniz ve "En küçük skoru olan en eski oyunu göster" gibi çok sayıda ölçütü kullanmak için sipariş işlevini değiştirebilirsiniz.

+0

güzel ve kısa. pencere işlevlerini kullanmak. – absurd