问:我在Access中创建查询时遇到困难,甚至不确定是否有可能。客户已从其原始请求中修改了要求。我需要对A列和B列进行计数。该表将按日期和时间顺序排列(请参见下文)。
每次时间段以零开始并以105结束,则计数(对于A列)将增加1。如果B列中出现100,则该计数增加。在该块中,然后计数(对于B列)增加1。在下一个块开始之前,第5列中可能有多个代码105。
对于以下示例,Col A计数= 2,Column B计数= 1
开始:1:06:12 AM结束:2:28:12 AM在该时间段中包含100(b列)
开始:2:28:20 AM结束:5:12:04 AM在该时间段中不包含100(b列)
| Date | Time | A | B |
| 1/20/2021 | 1:06:12 AM | 0 | 100 |
| 1/20/2021 | 1:06:16 AM | 0 | 100 |
| 1/20/2021 | 1:06:20 AM | 0 | 100 |
| 1/20/2021 | 2:28:12 AM | 105 | 100 |
| 1/20/2021 | 2:28:16 AM | 105 | 100 |
| 1/20/2021 | 2:28:20 AM | 0 | 10 |
| 1/20/2021 | 3:50:08 AM | 0 | 10 |
| 1/20/2021 | 3:50:12 AM | 0 | 10 |
| 1/20/2021 | 3:50:16 AM | 0 | 10 |
| 1/20/2021 | 5:12:04 AM | 105 | 10 |
| 1/20/2021 | 5:12:08 AM | 105 | 10 |
| 1/20/2021 | 5:12:12 AM | 105 | 10 |
我知道我可以在Excel中做到这一点而没有任何问题,但是客户端正在寻找执行相同操作的查询。
答:非常不寻常的问题。您可以通过计算每行上或之后出现的105的数量来将“块”分配给A。组具有恒定值。然后-如果我理解正确的话-过滤到0行并进行汇总。
这比在不支持count(distinct)或窗口功能的MS Access中所需的技巧更为棘手。但是我认为这可以满足您的需求:
select count(*) as num_a, sum(has_b) as num_bs
from (select grp, max(iif(b = 100, 1, 0)) as has_b
from (select t.*,
(select count(*)
from t as t2
where t2.datetime >= t.datetime and
t2.a = 105
) as grp
from t
) as t
where t.a = 0
group by grp
) as t;