访问查询以计算具有不同开始和结束值的实例

问题描述

我在 Access 中创建查询时遇到困难,我不确定这是否可行。客户已根据其原始请求修改了要求。我需要对 A 列和 B 列进行计数。表格将按日期和时间顺序排列(见下文)。

每当一个时间块以 0 开始并以 105 结束时,计数(对于 A 列)增加 1。如果 100 出现在 B 列中;在该块内,则计数(对于 B 列)增加 1。在下一个块开始之前,第 5 列中可能有多个代码 105。

对于下面的示例,A 列计数 = 2,B 列计数 = 1

开始:凌晨 1:06:12 结束:凌晨 2:28:12 时间块中包含100(b列)

开始:凌晨 2:28:20 结束:上午 5:12:04 时间块中不包含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;