GROUP BY和聚合函数查询

时间:2013-09-11 19:19:14

标签: sql ms-access ms-access-2010

我正在寻找一个简单的排行榜进行计时赛。会员可以进行多次时间试验,但我只希望显示最快的结果。我的表格列如下:

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,但这将返回通常不正确的第一个日期。

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

1 个答案:

答案 0 :(得分:1)

从问题的一小部分开始,让自己更容易完成这项任务。首先从TimeTimeTrials的每个组合获得MemberID的最低Distance

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。你的问题表明你已经知道如何做到这一点,所以我会留给你。 : - )