Files
2025-09-09 12:34:47 +08:00

41 lines
1.5 KiB
SQL

-- 清理 t_alert_info 表,只保留每个 alert_type 类型的两条最新记录
-- 使用 test 数据库
USE test;
-- 显示清理前的统计
SELECT '=== 清理前的数据统计 ===' as info;
SELECT alert_type, COUNT(*) as count FROM t_alert_info GROUP BY alert_type ORDER BY alert_type;
SELECT 'Total records before cleanup:' as info, COUNT(*) as total FROM t_alert_info;
-- 创建临时表来标识要保留的记录
CREATE TEMPORARY TABLE temp_keep_alerts AS
SELECT id FROM (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY alert_type ORDER BY occur_at DESC) as rn
FROM t_alert_info
WHERE is_deleted = 0
) ranked
WHERE rn <= 2;
-- 显示要保留的记录
SELECT '=== 要保留的记录 ===' as info;
SELECT a.id, a.alert_type, a.user_id, a.device_sn, a.occur_at
FROM t_alert_info a
INNER JOIN temp_keep_alerts t ON a.id = t.id
ORDER BY a.alert_type, a.occur_at DESC;
-- 执行删除操作(删除不在保留列表中的记录)
DELETE FROM t_alert_info
WHERE id NOT IN (SELECT id FROM temp_keep_alerts);
-- 显示清理后的统计
SELECT '=== 清理后的数据统计 ===' as info;
SELECT alert_type, COUNT(*) as count FROM t_alert_info GROUP BY alert_type ORDER BY alert_type;
SELECT 'Total records after cleanup:' as info, COUNT(*) as total FROM t_alert_info;
-- 显示最终保留的记录
SELECT '=== 最终保留的记录 ===' as info;
SELECT id, alert_type, user_id, device_sn, occur_at FROM t_alert_info ORDER BY alert_type, occur_at DESC;
-- 清理临时表
DROP TEMPORARY TABLE temp_keep_alerts;