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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:20:41