1

需要有关 SQL 中的 Min 函数的帮助

我有一个如下所示的表格。

+------------+-------+--------+
| 日期_ | 姓名 | 分数 |
+------------+-------+--------+
| 2012/07/05 | 杰克 | 1 |
| 2012/07/05 | 琼斯 | 1 |
| 2012/07/06 | 吉尔 | 2 |
| 2012/07/06 | 詹姆斯 | 3 |
| 2012/07/07 | 雨果 | 1 |
| 2012/07/07 | 杰克 | 1 |
| 2012/07/07 | 吉姆 | 2 |
+------------+-------+--------+

我想得到如下输出

+------------+------+--------+
| 日期_ | 姓名 | 分数 |
+------------+------+--------+
| 2012/07/05 | 杰克 | 1 |
| 2012/07/06 | 吉尔 | 2 |
| 2012/07/07 | 雨果 | 1 |
+------------+------+--------+

当我只使用日期和分数列的 MIN() 函数时,我得到每个日期的最低分数,这就是我想要的。如果同一日期的分数相同,我不在乎返回哪一行。当我还想要输出中的名称列时,麻烦就开始了。我尝试了一些 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

4 回答 4

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 演示

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

由于每个日期我们只想要一个名字,然后我们按dateand分组score,选择任何一个名字:MIN(name)

如果我们要显示name列,我们必须使用聚合函数 onname来方便GROUP BYondatescore列,否则它将不起作用(我们也可以MAX()在该列上使用)。

于 2012-07-07T18:42:31.030 回答
1

请了解GROUP BYRDBMS 的功能。

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

这假设每个名称和每个日期只出现一次,这仅适用于 MySQL。

要使其在其他 RDBMS 上工作,您需要在 Date 列上应用另一个组函数,例如 MAX。分钟。ETC

于 2012-07-07T18:08:22.523 回答
0
SELECT T.Name, T.Date_, MIN(T.Score) as Score FROM T 
 GROUP BY T.Date_
于 2012-07-07T18:35:26.130 回答
0

编辑:正如JNK在评论中指出的那样,这个答案没有得到纠正

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

这里我使用 MAX(NAME),如果发现两个名称具有相同的目标编号,它将选择一个名称。

这将找到每天的最低分数(没有重复),由任何玩家得分。以 Z 开头的名称将优先于以 A 开头的名称。

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

于 2012-07-07T18:57:52.883 回答