SQL中的MIN()函数

时间:2012-07-07 18:05:49

标签: sql min

需要SQL中的Min函数帮助

我有一张桌子如下所示。

+------------+-------+-------+
|   Date_    | Name  | Score |
+------------+-------+-------+
| 2012/07/05 | Jack  |     1 |
| 2012/07/05 | Jones |     1 |
| 2012/07/06 | Jill  |     2 |
| 2012/07/06 | James |     3 |
| 2012/07/07 | Hugo  |     1 |
| 2012/07/07 | Jack  |     1 |
| 2012/07/07 | Jim   |     2 |
+------------+-------+-------+

我想获得如下输出


+------------+------+-------+
|   Date_    | Name | Score |
+------------+------+-------+
| 2012/07/05 | Jack |     1 |
| 2012/07/06 | Jill |     2 |
| 2012/07/07 | Hugo |     1 |
+------------+------+-------+

当我使用MIN()函数时只有日期和分数列,我得到每个日期的最低分数,这就是我想要的。如果同一日期的得分存在平局,我不关心返回哪一行。当我还想要输出中的name列时,麻烦就开始了。我尝试了一些SQL的变体(即min与相关的子查询),但我没有运气得到如上所示的输出。任何人都可以帮助请:)

查询如下

SELECT DISTINCT 
A.USername, A.Date_, A.Score 
FROM TestTable AS A 
INNER JOIN (SELECT Date_,MIN(Score) AS MinScore 
FROM TestTable 
GROUP BY Date_) AS B 
ON (A.Score = B.MinScore) AND (A.Date_ = B.Date_);

4 个答案:

答案 0 :(得分:6)

使用此解决方案:

SELECT a.date_, MIN(name) AS name, a.score
FROM tbl a
INNER JOIN
(
    SELECT date_, MIN(score) AS minscore
    FROM tbl
    GROUP BY date_
) b ON a.date_ = b.date_ AND a.score = b.minscore
GROUP BY a.date_, a.score

SQL-Fiddle Demo

这将获得我们用于加入主表的INNER JOIN子选择中每个日期的最低分数。一旦我们加入子选择,我们将只有名称具有最低分数的日期(显示关系)。

由于我们每个日期只需要一个名称,因此我们会按datescore分组,选择任意名称:MIN(name)

如果我们想要显示name列,我们必须使用name上的聚合函数来促进GROUP BYdate列上的score,否则它将无法工作(我们也可以在该列上使用MAX()。)

答案 1 :(得分:1)

请了解RDBMS的GROUP BY功能。

SELECT Date_,Name,MIN(Score)
FROM T
GROUP BY Name

这假设EACH NAME和EACH日期只出现一次,这只适用于MySQL。

要使其在其他RDBMS上运行,您需要在Date列上应用另一个组函数,如MAX。 MIN。等

答案 2 :(得分:0)

SELECT T.Name, T.Date_, MIN(T.Score) as Score FROM T 
 GROUP BY T.Date_

答案 3 :(得分:0)

编辑:正如JNK在评论

中指出的那样,这个答案没有得到纠正
SELECT Date_,MAX(Name),MIN(Score)
FROM T
GROUP BY Date_

我在这里使用MAX(NAME),如果找到两个具有相同目标数的名字,它将选择一个名称。

这将找到每天的最低得分(没有重复),由任何球员得分。首先选择以Z开头的名称,而不是以A开头的名称。

编辑:通过按名称删除分组来修复