mysql删除重复数据
select emp_id,count(*) num from emp_attendance_progress where attend_year_month = '2025-05-06' GROUP BY emp_id HAVING num >1;
delete from emp_attendance_progress where id in (
WITH RankedData AS (
SELECT
id,
emp_id,
COUNT(*) AS num,
ROW_NUMBER() OVER (PARTITION BY emp_id ) AS rn
FROM
emp_attendance_progress
WHERE
attend_year_month = '2025-05-06'
GROUP BY
emp_id
HAVING
COUNT(*) > 1
)
SELECT
id
FROM
RankedData
WHERE
rn = 1);
ROW_NUMBER() OVER (PARTITION BY emp_id) AS rn 是一个窗口函数的用法。它的作用是为每个emp_id分配一个唯一的序号(rn),序号是按照分组(PARTITION BY emp_id)内的记录顺序生成的。详细解释
-
ROW_NUMBER():-
这是一个窗口函数,用于为每一行生成一个唯一的序号。
-
序号是从1开始,按顺序递增的。
-
-
OVER (PARTITION BY emp_id):-
PARTITION BY子句用于将数据分组。在这里,数据是按照emp_id分组的。 -
每个
emp_id分组内的记录会独立编号,序号从1开始,依次递增。
-
-
AS rn:-
这是给生成的序号列起了一个别名
rn,方便后续引用。
-
在你的SQL语句中的作用
ROW_NUMBER() OVER (PARTITION BY emp_id) AS rn的作用是为每个emp_id分组内的记录分配一个序号。然后,通过WHERE rn = 1,你选择了每个emp_id分组中的第一条记录(即序号为1的记录)。FROM employees
GROUP BY emp_id
SELECT id, emp_id, chengji,
MAX(chengji) OVER (PARTITION BY emp_id) AS max_salary
FROM employees; 按emp_id分组,并取各个组的最大值。
如果不用窗口函数,则需要先分组取到最大成绩,再与原表联查。
SELECT e.id, e.emp_id, e.chengji, m.max_chengji
FROM employees e
JOIN (
SELECT emp_id, MAX(chengji) AS max_chengji
FROM employees
GROUP BY emp_id
) m ON e.emp_id = m.emp_id;

浙公网安备 33010602011771号