SQL查询以选择具有最小值的不同行

bal*_*aji 46 sql database greatest-n-per-group

我想要一个SQL语句来获取具有最小值的行.

考虑一下这个表:

id  game   point
1    x      5
1    z      4
2    y      6
3    x      2
3    y      5
3    z      8
Run Code Online (Sandbox Code Playgroud)

如何选择列中具有最小值的ID point,按游戏分组?像这样:

id  game   point    
1    z      4
2    y      5
3    x      2   
Run Code Online (Sandbox Code Playgroud)

小智 52

使用:

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
Run Code Online (Sandbox Code Playgroud)

  • @SouravSarkar,这将无法工作该示例将返回原始查询的每一行,因为它正在寻找每个id*和*游戏的最低点.(例如id = 1且game = x为5的最低分; id = 1且game = z为4的最低分) (6认同)
  • 必要的complecation SELECT id,game,MIN(point)FROM tablename GROUP BY id,game (5认同)

Shi*_*roy 16

这是做同样事情的另一种方式,它可以让你做一些有趣的事情,比如选择前5名获胜游戏等.

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

您现在可以正确获取被识别为分数最低的行的实际行,并且您可以修改排序函数以使用多个条件,例如"向我显示分数最小的最早的游戏"等.


Asp*_*ant 15

这会奏效

select * from table 
where (id,point) IN (select id,min(point) from table group by id);
Run Code Online (Sandbox Code Playgroud)

  • 哦!我不知道MySQL ...查询是子查询中的多列检查,它在Oracle中可以工作。 (2认同)

a_h*_*ame 12

由于sql仅标记了以下内容,因此以下是使用ANSI SQL和窗口函数:

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;
Run Code Online (Sandbox Code Playgroud)