1

我正在考虑为计时赛制作一个简单的排行榜。一个成员可能会进行多次计时赛,但我只想显示他们最快的结果。我的表格列如下:

Members    { ID (PK), Forename, Surname }
TimeTrials { ID (PK), MemberID, Date, Time, Distance }

一个示例数据集将是:

Forename | Surname | Date     | Time | Distance
Bill       Smith     01-01-11   1.14   100
Dave       Jones     04-09-11   2.33   100
Bill       Smith     02-03-11   1.1    100

我从上面的例子得到的答案是:

Forename | Surname | Date     | Time | Distance
Bill       Smith     02-03-11   1.1    100
Dave       Jones     04-09-11   2.33   100

到目前为止我有这个,但访问抱怨我没有使用 Date 作为聚合函数的一部分:

SELECT Members.Forename, Members.Surname, Min(TimeTrials.Time) AS MinOfTime, TimeTrials.Date
FROM Members
INNER JOIN TimeTrials ON Members.ID = TimeTrials.Member
GROUP BY Members.Forename, Members.Surname, TimeTrials.Distance
HAVING TimeTrials.Distance = 100
ORDER BY MIN(TimeTrials.Time);

如果我从 SELECT 中删除日期,则查询有效(没有日期)。我曾尝试在 TimeTrials.Date 上使用 FIRST,但这将返回通常不正确的第一个日期。

显然,将日期作为 GROUP BY 的一部分不会返回我所追求的结果集。

4

1 回答 1

1

从较小的问题开始,让您自己更轻松地完成这项任务。Time首先从和TimeTrials的每个组合中获取最小值。MemberIDDistance

SELECT 
    tt.MemberID,
    tt.Distance,
    Min(tt.Time) AS MinOfTime
FROM TimeTrials AS tt
GROUP BY
    tt.MemberID,
    tt.Distance;

假设 SQL 是正确的,请在您TimeTrials再次加入的子查询中使用它。

SELECT tt2.*
FROM
    TimeTrials AS tt2
    INNER JOIN
    (
        SELECT 
            tt.MemberID,
            tt.Distance,
            Min(tt.Time) AS MinOfTime
        FROM TimeTrials AS tt
        GROUP BY
            tt.MemberID,
            tt.Distance
    ) AS sub
    ON
            tt2.MemberID = sub.MemberID
        AND tt2.Distance = sub.Distance
        AND tt2.Time = sub.MinOfTime
WHERE tt2.Distance = 100
ORDER BY tt2.Time;

最后,您可以加入该查询Members以获取ForenameSurname。您的问题表明您已经知道如何做到这一点,所以我将其留给您。:-)

于 2013-09-11T19:45:24.570 回答