如何实现AttLog表按日期去重统计InOut记录(每日计1条)
解决方案:按日期去重统计AttLog记录数
嗨,我来帮你搞定这个统计问题!先理清楚你的核心需求:对指定Id的打卡记录,每个日期不管有多少条IN记录,只计1条,最终统计符合条件的日期总数(你要的结果是3,而非原始的4条记录数)。
先把你的表结构整理成更清晰的表格形式:
| Id | Date | InOut |
|---|---|---|
| 10 | 2018-05-01 | IN |
| 10 | 2018-05-01 | IN |
| 10 | 2018-05-02 | IN |
| 10 | 2018-05-03 | IN |
为什么你的原查询没得到正确结果?
你写的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]
执行后会返回你想要的结果:
| Id | Unique_Date_Count |
|---|---|
| 10 | 3 |
方法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
相关产品推荐
相关产品推荐

