每组前 3 名,包括 0
Top 3 per group including 0
我有一个 table,我希望从 Access 2010 开始每周按 ErrorMargin return 前 3 条记录。
我遇到的问题是 0 个值被忽略了,我希望在平局的情况下只看到 1 条记录,平局将使记录总数超过 3。
我的table是:
注意:VBA 在 post 的底部创建 table.
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
此 return 如下 table,仅显示 2015 年 5 月 10 日的两条记录 - 还有两条 ErrorMargin 为 0 的记录,我希望它return 也是其中之一。哪个都没关系。
TMID 和 WeekCommencing 字段将构成 table.
的关键字段
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 创建 table:
的代码
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
以下可以满足您的要求:
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 可能 return 多于三行。如果您不想重复,则在 ORDER BY
中包含一个 id 列以防止联系:
ORDER BY em2.ErrorMargin, em2.TMID
我有一个 table,我希望从 Access 2010 开始每周按 ErrorMargin return 前 3 条记录。
我遇到的问题是 0 个值被忽略了,我希望在平局的情况下只看到 1 条记录,平局将使记录总数超过 3。
我的table是:
注意:VBA 在 post 的底部创建 table.
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
此 return 如下 table,仅显示 2015 年 5 月 10 日的两条记录 - 还有两条 ErrorMargin 为 0 的记录,我希望它return 也是其中之一。哪个都没关系。 TMID 和 WeekCommencing 字段将构成 table.
的关键字段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 创建 table:
的代码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
以下可以满足您的要求:
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 可能 return 多于三行。如果您不想重复,则在 ORDER BY
中包含一个 id 列以防止联系:
ORDER BY em2.ErrorMargin, em2.TMID