在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
相关产品推荐
相关产品推荐

