TEL:400-8793-956
当前位置:程序、服务器

访问查询以对具有不同开始值和结束值的实例进行计数

提问者: 近期获赞: 浏览人数: 发布时间:2021-03-10 09:49:49

 问:我在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;
上一篇: 是否可以将UIMenuController用作输入能力?
下一篇: 将char数组移位N个点