xinli/sql/清理重复测评记录.sql

104 lines
2.9 KiB
MySQL
Raw Normal View History

2025-12-02 19:19:58 +08:00
-- ========================================
-- 清理重复测评记录
-- 每个用户对每个量表只保留最新的一条记录
-- 创建时间: 2025-12-02
-- ========================================
-- 第一步:查看重复记录情况
SELECT
user_id,
scale_id,
COUNT(*) as record_count,
GROUP_CONCAT(assessment_id ORDER BY assessment_id DESC) as assessment_ids,
GROUP_CONCAT(status) as statuses
FROM psy_assessment
WHERE user_id IS NOT NULL
GROUP BY user_id, scale_id
HAVING COUNT(*) > 1
ORDER BY record_count DESC;
-- 第二步:查看将要删除的记录(预览)
SELECT a.*
FROM psy_assessment a
WHERE a.assessment_id NOT IN (
SELECT MAX(t.assessment_id)
FROM psy_assessment t
WHERE t.user_id IS NOT NULL
GROUP BY t.user_id, t.scale_id
)
AND a.user_id IS NOT NULL
ORDER BY a.user_id, a.scale_id, a.assessment_id;
-- 第三步:备份将要删除的记录
CREATE TABLE IF NOT EXISTS psy_assessment_backup_duplicate AS
SELECT a.*
FROM psy_assessment a
WHERE a.assessment_id NOT IN (
SELECT MAX(t.assessment_id)
FROM psy_assessment t
WHERE t.user_id IS NOT NULL
GROUP BY t.user_id, t.scale_id
)
AND a.user_id IS NOT NULL;
-- 验证备份
SELECT COUNT(*) AS '备份的重复记录数' FROM psy_assessment_backup_duplicate;
-- 第四步:删除相关的答案记录
DELETE FROM psy_assessment_answer
WHERE assessment_id IN (
SELECT assessment_id FROM psy_assessment_backup_duplicate
);
-- 第五步:删除相关的因子得分记录
DELETE FROM psy_factor_score
WHERE assessment_id IN (
SELECT assessment_id FROM psy_assessment_backup_duplicate
);
-- 第六步:删除相关的预警记录
DELETE FROM psy_warning
WHERE assessment_id IN (
SELECT assessment_id FROM psy_assessment_backup_duplicate
);
-- 第七步:删除相关的报告记录
DELETE FROM psy_assessment_report
WHERE assessment_id IN (
SELECT assessment_id FROM psy_assessment_backup_duplicate
);
-- 第八步:删除重复的测评记录(只保留每个用户对每个量表的最新记录)
DELETE FROM psy_assessment
WHERE assessment_id IN (
SELECT assessment_id FROM psy_assessment_backup_duplicate
);
-- 第九步:验证清理结果
SELECT
user_id,
scale_id,
COUNT(*) as record_count
FROM psy_assessment
WHERE user_id IS NOT NULL
GROUP BY user_id, scale_id
HAVING COUNT(*) > 1;
-- 如果返回空结果,说明清理成功
-- 第十步:查看清理后的记录数
SELECT COUNT(*) AS '清理后的测评记录数' FROM psy_assessment;
-- ========================================
-- 如果需要恢复数据,执行以下语句:
-- ========================================
/*
INSERT INTO psy_assessment SELECT * FROM psy_assessment_backup_duplicate;
*/
-- ========================================
-- 清理完成后,可以删除备份表:
-- ========================================
/*
DROP TABLE IF EXISTS psy_assessment_backup_duplicate;
*/