需要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_);
答案 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
这将获得我们用于加入主表的INNER JOIN
子选择中每个日期的最低分数。一旦我们加入子选择,我们将只有名称具有最低分数的日期(显示关系)。
由于我们每个日期只需要一个名称,因此我们会按date
和score
分组,选择任意名称:MIN(name)
。
如果我们想要显示name
列,我们必须使用name
上的聚合函数来促进GROUP BY
和date
列上的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开头的名称。
编辑:通过按名称删除分组来修复