MySQL中如何针对特定公司跳过重复日期的多余记录?
解决SQL查询中按日期去重保留第一条记录的问题
问题核心
你要实现的是:针对Google公司,每个入职日期只留第一条记录,再做聚合统计。但你的原查询有两个关键问题:
count(user)统计的是所有Google用户的总数,没过滤同日期的重复记录group_concat(DISTINCT user)只是去重用户,但没按日期筛选仅保留每个日期的第一个用户
正确实现
用窗口函数ROW_NUMBER()先筛选出每个日期的第一条记录,再聚合:
WITH filtered_employees AS ( SELECT user, joining_date, company, -- 按公司+入职日期分组,组内按用户名排序取第一条(可换其他排序字段) ROW_NUMBER() OVER (PARTITION BY company, joining_date ORDER BY user) AS rn FROM employee WHERE company = 'Google' ) SELECT COUNT(user) AS 数量, GROUP_CONCAT(user ORDER BY joining_date) AS 用户, GROUP_CONCAT(joining_date ORDER BY joining_date) AS 日期, company AS 公司 FROM filtered_employees WHERE rn = 1 GROUP BY company;
步骤说明
先筛选有效记录:
PARTITION BY company, joining_date把数据按公司和入职日期拆分分组ORDER BY user用来确定“第一条”的顺序,如果你有记录创建时间这类字段,换成ORDER BY create_time会更准确- 只保留
rn = 1的行,也就是每个日期的第一条用户记录
再做聚合统计:
对筛选后的记录按公司分组,此时每个日期只有一条用户数据,统计数量、拼接用户和日期就能得到预期结果
兼容旧版本SQL的写法
如果你的数据库不支持CTE(比如老版本MySQL),可以用子查询替代:
SELECT COUNT(user) AS 数量, GROUP_CONCAT(user ORDER BY joining_date) AS 用户, GROUP_CONCAT(joining_date ORDER BY joining_date) AS 日期, company AS 公司 FROM ( SELECT user, joining_date, company, ROW_NUMBER() OVER (PARTITION BY company, joining_date ORDER BY user) AS rn FROM employee WHERE company = 'Google' ) AS temp WHERE rn = 1 GROUP BY company;
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

