2013-03-08 12 views
23

Ich möchte eine SQL-Anweisung, um die Zeile mit einem Mindestwert zu erhalten.SQL-Abfrage zum Auswählen einer bestimmten Zeile mit Mindestwert

Betrachten Sie diese Tabelle:

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

Wie kann ich die IDs auszuwählen, die den Minimalwert in der point Spalte haben, durch Spiel gruppiert? Wie folgt aus:

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

Sie müssen der gleichen Tabelle beitreten, um das gewünschte Ergebnis zu erhalten. Überprüfen Sie die Abfrage unten in der Antwort. –

+4

Warum ist Spiel "y" Punkt Wert 6 anstelle von 5 in Ihren Ergebnissen? – billynoah

+1

Da das OP nicht geantwortet hat, kann ich nur annehmen, dass er "nach ID gruppiert" fragen und zeigen wollte, welches Spiel das niedrigste Ergebnis hatte ... –

Antwort

30

Verwendung:

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

Genau ..! Danke – balaji

+0

Kann ein einzelner innerer Join gemacht werden, wenn man in einem SQL in Microsoft Zugang schreibt? – KSM

+4

unnötige Ergänzung SELECT ID, Spiel, MIN (Punkt) FROM Tabellenname GROUP BY ID, Spiel –

-3

Versuchen:

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

Ich erhalte diesen Fehler "Spalte 'student.point' ist ungültig in der HAVING-Klausel, weil sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist " – balaji

+0

Könnten Sie es jetzt versuchen? – www

+0

gleicher Fehler. Ich verwende MS SQL – balaji

10

Dies funktioniert

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

Welche rdbms verwenden Sie? – Aspirant

+0

Ich benutze MS SQL – balaji

+1

Ohh !! Ich weiß nichts über MySQL ... Die Abfrage ist eine mehrspaltige Eincheck-Unterabfrage, die in Oracle funktionieren wird. – Aspirant

0

Ken Clark's answer nicht in meinem Fall arbeiten. Es könnte auch nicht in Ihrem arbeiten. Wenn nicht, versuchen Sie dies:

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

Eine kurze Erklärung, wie dieser Code die Frage beantwortet, würde diese Antwort – jmoreno

7

Da dies mit sql nur markiert ist, der folgende wird mit ANSI SQL und einem window function:

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

Dies ist ein weiterer Weg, um die gleiche Sache zu tun , die es Ihnen ermöglichen würde, interessante Dinge zu tun, wie zum Beispiel die Top-5-Gewinnspiele usw.

Sie können jetzt die tatsächliche Zeile, die als die mit der niedrigsten Punktzahl identifiziert wurde, korrekt abrufen und die Sortierfunktion so ändern, dass mehrere Kriterien verwendet werden, z. B. "Zeig mir das früheste Spiel mit der kleinsten Punktzahl" usw.

+0

schön und kurz verbessern. Fensterfunktionen ausnutzen. – absurd

Verwandte Themen