MySQL查询去重:重复数据仅保留最早log记录的实现方案
MySQL查询实现:去重并保留最早log记录
原始数据
emp_id| name | log | 16646 | bella | 2023-01-30 07:28:54 | 9050 | mark | 2023-01-30 07:22:12 | 8612 | nandya | 2023-01-30 07:20:35 | 7965 | arya | 2023-01-30 06:21:39 | 7965 | arya | 2023-01-30 06:21:40 |
原始查询语句
SELECT h.emp_id, p.name, h.log FROM presence.history h JOIN employee p on p.emp_id = h.emp_id and h.log >= '2023-01-30 05:00:00' and h.log <= '2023-01-30 07:45:00'
需求
对重复的emp_id仅显示一条记录,且保留该emp_id对应的最早log值。
解决方案
方法1:GROUP BY + MIN()聚合函数(兼容所有MySQL版本)
通过按emp_id和name分组,利用MIN()函数提取每个分组的最早log:
SELECT h.emp_id, p.name, MIN(h.log) AS log FROM presence.history h JOIN employee p ON p.emp_id = h.emp_id WHERE h.log >= '2023-01-30 05:00:00' AND h.log <= '2023-01-30 07:45:00' GROUP BY h.emp_id, p.name;
注意:若
employee表中emp_id是主键,name与emp_id一一对应,在MySQL 5.7+开启ONLY_FULL_GROUP_BY模式时,GROUP BY子句仅需包含h.emp_id即可。
方法2:窗口函数ROW_NUMBER()(MySQL 8.0及以上版本)
给每个emp_id的记录按log升序分配序号,筛选序号为1的记录(即最早的log):
WITH ranked_logs AS ( SELECT h.emp_id, p.name, h.log, ROW_NUMBER() OVER (PARTITION BY h.emp_id ORDER BY h.log ASC) AS rn FROM presence.history h JOIN employee p ON p.emp_id = h.emp_id WHERE h.log >= '2023-01-30 05:00:00' AND h.log <= '2023-01-30 07:45:00' ) SELECT emp_id, name, log FROM ranked_logs WHERE rn = 1;
内容的提问来源于stack exchange,提问作者Rahadian Wiratama
相关产品推荐
相关产品推荐

