我正在寻找一个简单的排行榜进行计时赛。会员可以进行多次时间试验,但我只希望显示最快的结果。我的表格列如下:
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的一部分将不会返回我所追求的结果集。
答案 0 :(得分:1)
从问题的一小部分开始,让自己更容易完成这项任务。首先从Time
和TimeTrials
的每个组合获得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
以获取Forename
和Surname
。你的问题表明你已经知道如何做到这一点,所以我会留给你。 : - )