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

如何实现AttLog表按日期去重统计InOut记录(每日计1条)

解决方案:按日期去重统计AttLog记录数

嗨,我来帮你搞定这个统计问题!先理清楚你的核心需求:对指定Id的打卡记录,每个日期不管有多少条IN记录,只计1条,最终统计符合条件的日期总数(你要的结果是3,而非原始的4条记录数)。

先把你的表结构整理成更清晰的表格形式:

IdDateInOut
102018-05-01IN
102018-05-01IN
102018-05-02IN
102018-05-03IN

为什么你的原查询没得到正确结果?

你写的SELECT DISTINCT COUNT([Date]), [Id] FROM AttLog GROUP BY [Date], [Id]问题出在:

  • GROUP BY [Date], [Id]会把每个日期+Id的组合单独分成一个分组,比如2018-05-01+10是一个分组,里面有2条记录,所以这个分组的COUNT([Date])是2;剩下两个日期各是一个分组,计数为1。
  • 加上DISTINCT也没用,因为它只是对最终返回的行去重,但这里每个分组的日期不同,所以会返回3行零散的计数数据,而不是你需要的总去重日期数。

正确的SQL查询语句

这里有两种简单有效的写法,任选其一即可:

方法1:用COUNT(DISTINCT)直接统计(最简洁)

这种写法直接对Date去重后计数,一步到位:

SELECT 
    [Id],
    COUNT(DISTINCT [Date]) AS Unique_Date_Count
FROM AttLog
WHERE [Id] = 10 -- 仅统计Id=10的情况,若要统计所有Id的各自数量,去掉此条件
GROUP BY [Id]

执行后会返回你想要的结果:

IdUnique_Date_Count
103

方法2:先去重再统计(更灵活)

如果后续需要扩展更多过滤条件,可先通过子查询获取Id和Date的唯一组合,再统计总数:

SELECT COUNT(*) AS Unique_Date_Count
FROM (
    SELECT DISTINCT [Id], [Date]
    FROM AttLog
    WHERE [Id] = 10
) AS Distinct_Date_Records

子查询会先得到3条唯一的(Id, Date)记录,外层再统计数量,结果同样是3。

内容的提问来源于stack exchange,提问作者Yohan Wijayanto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:12:55