-- 009_fix_duplicate_monthly_status.sql -- monthly_worker_status 테이블의 중복 데이터 정리 -- 1. 중복 데이터 확인 (디버깅용) -- SELECT worker_id, date, COUNT(*) as cnt -- FROM monthly_worker_status -- GROUP BY worker_id, date -- HAVING cnt > 1; -- 2. 중복 데이터 정리: 같은 worker_id, date에 대해 최신 데이터만 남기고 나머지 삭제 DELETE mws1 FROM monthly_worker_status mws1 INNER JOIN ( SELECT worker_id, date, MAX(id) as keep_id FROM monthly_worker_status GROUP BY worker_id, date ) mws2 ON mws1.worker_id = mws2.worker_id AND mws1.date = mws2.date AND mws1.id < mws2.keep_id; -- 3. 중복 제거 후 데이터 재집계 (선택사항) -- 만약 합산이 필요하다면 다음 프로시저를 실행 DELIMITER $$ CREATE OR REPLACE PROCEDURE ConsolidateDuplicateMonthlyStatus() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE v_worker_id INT; DECLARE v_date DATE; -- 중복이 있는 worker_id, date 조합 찾기 DECLARE cur CURSOR FOR SELECT worker_id, date FROM monthly_worker_status GROUP BY worker_id, date HAVING COUNT(*) > 1; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO v_worker_id, v_date; IF done THEN LEAVE read_loop; END IF; -- 해당 작업자의 해당 날짜 데이터를 재계산하여 업데이트 CALL UpdateMonthlyWorkerStatus(v_date, v_worker_id); END LOOP; CLOSE cur; END$$ DELIMITER ; -- 4. 프로시저 실행하여 중복 데이터 통합 -- CALL ConsolidateDuplicateMonthlyStatus(); -- 5. 확인: 중복이 남아있는지 체크 SELECT '중복 체크 완료' as message, COUNT(*) as remaining_duplicates FROM ( SELECT worker_id, date, COUNT(*) as cnt FROM monthly_worker_status GROUP BY worker_id, date HAVING cnt > 1 ) duplicates;