Select table 中每个标准的前 n 个(变量)基于另一个 table

Select top n (variable) for each criteria in a table based on another table

我想要一个 VBA 代码来进行查询,以根据每个模型 ID 的 TopN(从第二个 table), 我知道我必须使用 QueryDef 和 Sql VBA 但我不知道如何编写代码

只是和例子来说明

我的第一个table是

EquipID Equip ActimeTime ModelID
1 DT1 10 1
2 DT2 6 1
3 DT3 13 1
4 DT4 15 1
5 DT5 16 2
6 DT6 12 2
7 DT7 6 2
8 DT8 13 2

我的第二个Table是

ModelID Model TopN
1 775 3
2 789 2

所以查询结果应该是这样的(Showing the Top 3 of 775 Model and the Top 2 of 789)

Equip ActimeTime Model
DT4 15 775
DT3 13 775
DT1 10 775
DT5 16 789
DT8 13 789

非常感谢,我真的被困在这个问题上,解决这个问题对我的项目有很大帮助

[Table1][1] [1]: https://i.stack.imgur.com/geMca.png [Table2][2] [2]: https://i.stack.imgur.com/lMPDP.png [查询结果][3] [3]: https://i.stack.imgur.com/cGf6k.png

你可以直接完成 SQL - 但是哦哦,跟随和构建很难看

我创建了 4 个查询,最后一个查询生成了您要查找的内容。

关键是根据您要查找的排序顺序(模型和 ActimeTime)获取 RowID。您可以使用 Dcount

获得伪行 ID

这是 4 个查询 - 如果您有胆量,我相信您可以制作一个混搭

我的表是 Table3Table4 - 您可以在第一个查询中更改它们以匹配您的数据库。 按顺序构建这些查询,因为它们依赖于前面的查询

qListModels

SELECT Table3.Equip, Table3.ActimeTime, Table4.Model, Table4.TopN, "" & [Model] & "-" & Format([ActimeTime],"000") AS [Model-ActTime]
FROM Table3 INNER JOIN Table4 ON Table3.ModelID = Table4.ModelID
ORDER BY Table4.Model, Table3.ActimeTime DESC;

qListModelsInOrder

SELECT qListModels.*, DCount("[Model-ActTime]","[qListModels]","[Model-ActTime]>=" & """" & [Model-ActTime] & """") AS row_id
FROM qListModels;

qListModelStartRows

SELECT qListModelsInOrder.Model, Min(qListModelsInOrder.row_id) AS MinOfrow_id
FROM qListModelsInOrder
GROUP BY qListModelsInOrder.Model;

qListTopNModels

SELECT qListModelsInOrder.Equip, qListModelsInOrder.ActimeTime, qListModelsInOrder.Model
FROM qListModelsInOrder INNER JOIN qListModelStartRows ON qListModelsInOrder.Model = qListModelStartRows.Model
WHERE ((([row_id]-[MinOfrow_id])<[TopN]))
ORDER BY qListModelsInOrder.Model, qListModelsInOrder.ActimeTime DESC;

最后一个可以运行随时得到你想要的结果

示例输出: