it-swarm.com.de

SQL-Abfrage zur Auswahl einer bestimmten Zeile mit minimalem Wert

Ich möchte, dass eine SQL-Anweisung die Zeile mit einem Mindestwert abruft. 

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 wähle ich die IDs mit dem Mindestwert in der Spalte point aus, gruppiert nach Spiel? So was:

id  game   point    
1    z      4
2    y      6
3    x      2   
36
balaji

Benutzen:

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
41
Ken Clark

Das wird funktionieren

select * from table 
where (id,point) IN (select id,min(point) from table group by id);
12
Aspirant

Dies ist eine andere Möglichkeit, das Gleiche zu tun, wodurch Sie interessante Dinge tun können, beispielsweise die Top-5-Gewinnspiele auswählen. 

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

Sie können jetzt die tatsächliche Zeile, die als die mit der niedrigsten Punktzahl bezeichnet wurde, korrekt abrufen und die Sortierfunktion ändern, um mehrere Kriterien zu verwenden, z. B. "Zeigen Sie mir das früheste Spiel mit der geringsten Punktzahl" usw. 

10
Shiroy

Da dies nur mit sql gekennzeichnet ist, werden ANSI SQL und eine window-Funktion verwendet:

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;
10

Ken Clarks Antwort hat in meinem Fall nicht funktioniert. Möglicherweise funktioniert es auch bei Ihnen nicht. Wenn nicht, probiere es aus:

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
samthebrand
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;
0
Tshultrim Dorji

Dieser alternative Ansatz verwendet den SQL Server-Befehl OUTER APPLY Klausel. So ist es

  1. erstellt die eindeutige Liste der Spiele und
  2. ruft den Datensatz mit der niedrigsten Punktzahl für dieses Spiel ab und gibt ihn aus.

Das OUTER APPLY-Klausel kann als LEFT JOIN, jedoch mit dem Vorteil, dass Sie Werte der Hauptabfrage als Parameter in der Unterabfrage verwenden (hier: game).

SELECT colMinPointID
FROM (
  SELECT game
  FROM table
  GROUP BY game
) As rstOuter
OUTER APPLY (
  SELECT TOP 1 id As colMinPointID
  FROM table As rstInner
  WHERE rstInner.game = rstOuter.game
  ORDER BY points
) AS rstMinPoints
0
The Conspiracy