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);

 

在你的SQL语句中,ROW_NUMBER() OVER (PARTITION BY emp_id) AS rn 是一个窗口函数的用法。它的作用是为每个emp_id分配一个唯一的序号(rn),序号是按照分组(PARTITION BY emp_id)内的记录顺序生成的。

详细解释

  1. ROW_NUMBER()
    • 这是一个窗口函数,用于为每一行生成一个唯一的序号。
    • 序号是从1开始,按顺序递增的。
  2. OVER (PARTITION BY emp_id)
    • PARTITION BY子句用于将数据分组。在这里,数据是按照emp_id分组的。
    • 每个emp_id分组内的记录会独立编号,序号从1开始,依次递增。
  3. AS rn
    • 这是给生成的序号列起了一个别名rn,方便后续引用。

在你的SQL语句中的作用

在你的SQL语句中,ROW_NUMBER() OVER (PARTITION BY emp_id) AS rn的作用是为每个emp_id分组内的记录分配一个序号。然后,通过WHERE rn = 1,你选择了每个emp_id分组中的第一条记录(即序号为1的记录)。
 
 
假如我想查询班级A里面各个学生各科成绩的最高分。则原来的sql比较好:
SELECT emp_id, MAX(chengji) AS max_chengji
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;

posted @ 2025-05-06 16:59  人在代码在  阅读(19)  评论(0)    收藏  举报