我有一个表,我想在Access 2010中每周通过ErrorMargin返回前3条记录。
我遇到的问题是忽略了0个值,我想在关系的情况下只看到1个记录,其中平局将占据记录总数超过3个。
我的表格是:
NB:帖子底部的VBA创建表。
TMID WeekCommencing ErrorMargin
1 05-Oct-15 0
1 12-Oct-15 2
3 05-Oct-15 1
3 12-Oct-15 1
8 12-Oct-15 2
9 05-Oct-15 0.333333333
9 12-Oct-15 4
12 05-Oct-15 0
12 12-Oct-15 1.5
我目前的SQL是:
SELECT T1.TMID,
T1.WeekCommencing,
T1.ErrorMargin,
COUNT(*)
FROM qry_REP_ErrorMargin T1 INNER JOIN qry_REP_ErrorMargin T2 ON
T1.ErrorMargin <= T2.ErrorMargin AND
T1.WeekCommencing = T2.WeekCommencing
GROUP BY T1.TMID,
T1.WeekCommencing,
T1.ErrorMargin
HAVING COUNT(*) <= 3
ORDER BY T1.WeekCommencing,
T1.ErrorMargin
这将返回下表,该表仅显示5/10/2015的两条记录 - 还有两条记录,其中包含0 ErrorMargin,我希望它也能返回其中一条记录。哪个没关系。 TMID和WeekCommencing字段将构成表的关键字段。
TMID WeekCommencing ErrorMargin Expr1003
9 05/10/2015 0.33 2
3 05/10/2015 1 1
1 12/10/2015 2 3
8 12/10/2015 2 3
9 12/10/2015 4 1
我已经开始使用其他解决方案,但还没有成功完成任务 - MS Access Select top n query grouped by multiple fields
创建表的VBA代码:
Sub Create()
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "CREATE TABLE qry_REP_ErrorMargin" & _
"(TMID LONG, WeekCommencing DATE, ErrorMargin Double)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (1,42282,0)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (1,42289,2)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (3,42282,1)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (3,42289,1)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (8,42289,2)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (9,42282,0.333333333333333)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (9,42289,4)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (12,42282,0)"
db.Execute "INSERT INTO qry_REP_ErrorMargin" & _
"(TMID, WeekCommencing, ErrorMargin) VALUES (12,42289,1.5)"
End Sub
答案 0 :(得分:0)
以下可能会做你想要的:
SELECT em.*
FROM qry_REP_ErrorMargin as em
WHERE em.TMID IN (SELECT TOP 3 TMID
FROM qry_REP_ErrorMargin as em2
WHERE em2.WeekCommencing = em.WeekCommencing
ORDER BY em2.ErrorMargin
);
请注意,在绑定的情况下,MS Access可能返回三行以上。您不需要重复项,然后在ORDER BY
中包含一个id列以防止绑定:
ORDER BY em2.ErrorMargin, em2.TMID