2013-03-08 78 views
23

我想要一条SQL语句来获取具有最小值的行。用于选择具有最小值的不同行的SQL查询

考虑一下这个表:

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

如何选择具有在point列最小值的ID,并以游戏分组?就像这样:

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

你需要加入同一张表才能得到想要的结果。在答案中检查下面的查询。 – 2013-03-08 10:51:32

+4

为什么游戏“y”在结果中指向的值是6而不是5? – billynoah 2014-08-20 19:40:59

+1

由于OP没有回应,我只能假设他打算问“按ID分组”,并显示哪个游戏有最低分数... – 2015-04-08 16:20:07

回答

30

用途:

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

正是..!谢谢 – balaji 2013-03-08 10:56:40

+0

在Microsoft Access中的SQL中写入时可以完成单个内部联接吗? – KSM 2014-04-11 16:53:37

+4

无用complecation SELECT ID,游戏,MIN(点)FROM表名GROUP BY ID,游戏 – 2014-05-09 16:12:55

-3

尝试:

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

我收到此错误“Column'student.point'无效在HAVING子句中,因为它不包含在集合函数或GROUP BY子句中。 “ – balaji 2013-03-08 10:35:13

+0

你现在可以尝试吗? – www 2013-03-08 10:39:33

+0

同样的错误。我正在使用MS SQL – balaji 2013-03-08 10:49:25

10

这将工作

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

您使用哪种rdbms? – Aspirant 2013-03-08 10:41:32

+0

我正在使用MS SQL – balaji 2013-03-08 10:47:34

+1

哦!我不知道MySQL ...查询是多列检查子查询它将在Oracle中工作。 – Aspirant 2013-03-08 11:17:09

0

Ken Clark's answer并没有我的情况下工作。它可能无法在你的工作。如果没有,试试这个:

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

简短的解释如何这个代码回答这个问题将大大改善这个答案 – jmoreno 2015-09-27 04:12:38

7

由于这是标有sql只,下面是一个使用ANSI SQL和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

这是做同样的事情的另一种方式,这将允许你做有趣的事情,如选择前5名的获胜游戏等。

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

您现在可以正确地获得被确定为具有最低分数的实际行,并且您可以修改排序功能以使用多个条件,例如“显示具有最小分数的最早游戏”等。

+0

好和短。利用窗口函数。 – absurd 2016-05-17 10:34:35