You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在MS Access SQL中实现去重计数与按时间范围分组的合并查询

在MS Access SQL中实现去重计数与按时间范围分组的合并查询

嘿,我看你已经把两个单独的需求摸得门儿清了,就差把它们整合到一块儿了!刚好Access SQL对COUNT(DISTINCT)的支持确实有点坑,咱们一步步来搞定这个问题。

首先得明确你的核心需求:把表中每个唯一的Data值只统计一次,然后按它们的Inputtime对应的小时时间范围来分组,统计每个时间段里有多少个这样的唯一Data。

先给你提个醒,你原来的第一个查询其实有语法问题——子查询里只选了DISTINCT Data,没有包含Inputtime,外面的GROUP BY Inputtime和SELECT Inputtime根本找不到这个字段,Access会直接报错的。咱们直接来写正确的整合查询,分两种常见场景给你:

场景1:同一个Data在不同小时出现,每个小时都算一次

如果你的需求是:只要某个Data在某个小时范围内有出现(不管出现多少次),就把它算在这个小时的统计里,哪怕它在其他小时也有出现,那用这个查询:

SELECT 
    FORMAT(Inputtime, 'hh:00:00 - hh:59:59') AS Timerange,
    COUNT(*) AS Aquired
FROM (
    -- 先获取所有唯一的Data和对应时间的组合,确保同小时同Data只留一条
    SELECT DISTINCT Data, Inputtime 
    FROM Datatable
) AS UniqueDataRecords
GROUP BY FORMAT(Inputtime, 'hh:00:00 - hh:59:59');

子查询先把重复的Data+时间组合去重,再在外面按小时范围分组计数,完美实现你要的“同小时内同Data只算一次”的效果。

场景2:同一个Data只算一次,按它第一次出现的小时统计

如果你的需求是:整个表中每个Data只统计一次,不管它出现多少次,按它最早出现的小时范围来归类,那用这个查询:

SELECT 
    FORMAT(MinInputtime, 'hh:00:00 - hh:59:59') AS Timerange,
    COUNT(*) AS Aquired
FROM (
    -- 先给每个Data绑定它最早的出现时间
    SELECT Data, MIN(Inputtime) AS MinInputtime
    FROM Datatable
    GROUP BY Data
) AS UniqueDataFirstOccurrence
GROUP BY FORMAT(MinInputtime, 'hh:00:00 - hh:59:59');

这里先通过子查询锁定每个Data的首次出现时间,再按这个时间的小时范围分组,确保整个表中每个Data只被统计一次。

你可以根据自己的实际业务需求选其中一种,这两个查询都能在Access里正常跑通。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:49:49