如何用Access SQL统计最新TxType为15的唯一modID数量
MS Access SQL 查询统计需求解决方案
日志表结构与数据
Logs表
| logID (自动编号) | modID (字符串) | relID (字符串) | DateTime (日期型) | TxType (短整型) |
|---|---|---|---|---|
| 1 | 1234 | 22.3 | 10/1/22 0800 | 6 |
| 2 | 1234 | 22.3 | 10/1/22 0900 | 7 |
| 3 | 1234 | 22.3 | 10/1/22 1000 | 13 |
| 4 | 1234 | 22.3 | 10/1/22 1100 | 15 |
| 5 | 4321 | 22.3 | 10/1/22 0830 | 1 |
| 6 | 4321 | 22.3 | 10/1/22 0930 | 13 |
| 7 | 4321 | 22.3 | 10/1/22 1030 | 15 |
| 8 | 4321 | 22.3 | 10/1/22 1130 | 13 |
| 9 | 1234 | 23.1 | 11/1/22 0800 | 1 |
| 10 | 1234 | 23.1 | 11/1/22 0900 | 15 |
| 11 | 1234 | 23.1 | 11/1/22 1000 | 13 |
| 12 | 1234 | 23.1 | 11/1/22 1100 | 15 |
| 13 | 4321 | 23.1 | 11/1/22 0830 | 13 |
| 14 | 4321 | 23.1 | 11/1/22 0930 | 7 |
| 15 | 4321 | 23.1 | 11/1/22 1030 | 13 |
| 16 | 4321 | 23.1 | 11/1/22 1130 | 15 |
查询需求
- 按
relID过滤数据; - 统计满足最新(按DateTime降序)事件的TxType为15的
modID数量。例如过滤relID=23.1时,应统计logID为12和16对应的2个modID。
现有尝试
已实现两个独立查询,但无法结合:
- 统计拥有特定TxType的唯一modID数量:
SELECT COUNT(*) FROM ( SELECT DISTINCT Logs.modID, Logs.relID FROM Logs WHERE ((Logs.relID='23.1') AND ((Logs.TxType=13))) );
- 获取指定modID和relID组合的最新事件TxType:
SELECT TOP 1 TxType FROM Logs WHERE (((Logs.modID=[EnterModID])) AND ((Logs.relID=[EnterRelID]))) ORDER BY DateTime DESC;
解决方案
要实现需求,需要先为每个modID+relID组合找到最新的记录,再筛选其中TxType=15的记录并统计数量。以下是适配MS Access的SQL语句:
方法1:使用子查询获取最新记录
SELECT COUNT(DISTINCT l.modID) AS CountOfModID FROM Logs l WHERE l.DateTime = ( SELECT MAX(DateTime) FROM Logs WHERE modID = l.modID AND relID = l.relID ) AND l.relID = '23.1' -- 替换为目标relID,或改为参数[EnterRelID] AND l.TxType = 15;
方法2:使用GROUP BY与子查询关联
SELECT COUNT(*) AS CountOfModID FROM ( SELECT l.modID FROM Logs l INNER JOIN ( SELECT modID, relID, MAX(DateTime) AS LatestDateTime FROM Logs WHERE relID = '23.1' GROUP BY modID, relID ) latest ON l.modID = latest.modID AND l.relID = latest.relID AND l.DateTime = latest.LatestDateTime WHERE l.TxType = 15 );
说明
- 两种方法都先定位每个
modID在指定relID下的最新时间记录,再筛选TxType=15的条目并统计唯一modID数量; - Access的GROUP BY要求所有非聚合字段都必须包含在GROUP BY子句中,所以子查询里需要同时按
modID和relID分组; - 可以将
'23.1'替换为参数[EnterRelID],实现交互式输入过滤条件。
内容的提问来源于stack exchange,提问作者Apethae
相关产品推荐
相关产品推荐

