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 个查询 - 如果您有胆量,我相信您可以制作一个混搭
我的表是 Table3
和 Table4
- 您可以在第一个查询中更改它们以匹配您的数据库。 按顺序构建这些查询,因为它们依赖于前面的查询
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;
最后一个可以运行随时得到你想要的结果
示例输出:
我想要一个 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
这是 4 个查询 - 如果您有胆量,我相信您可以制作一个混搭
我的表是 Table3
和 Table4
- 您可以在第一个查询中更改它们以匹配您的数据库。 按顺序构建这些查询,因为它们依赖于前面的查询
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;
最后一个可以运行随时得到你想要的结果
示例输出: