USE zhiyuantong; SET NAMES utf8mb4; SET SESSION sql_log_bin=0; START TRANSACTION; -- 本脚本每次只处理暂存表中的一个省份,避免全国数据在单个大事务中占满磁盘。 SET @target_province=(SELECT MIN(province_name) FROM stg_gc_enrollment_plans WHERE admission_year=2025); CREATE TEMPORARY TABLE tmp_gc_old_review_keys ( entity_type VARCHAR(64) NOT NULL, entity_key VARCHAR(128) NOT NULL, PRIMARY KEY (entity_type, entity_key) ) ENGINE=InnoDB; INSERT IGNORE INTO tmp_gc_old_review_keys SELECT 'admission_group', CAST(admission_group_id AS CHAR) FROM admission_groups WHERE admission_year=2025 AND province_name=@target_province; INSERT IGNORE INTO tmp_gc_old_review_keys SELECT 'major_plan', CAST(p.major_plan_id AS CHAR) FROM admission_major_plans p JOIN admission_groups g ON g.admission_group_id=p.admission_group_id WHERE g.admission_year=2025 AND g.province_name=@target_province; INSERT IGNORE INTO tmp_gc_old_review_keys SELECT 'major_admission', CAST(major_line_id AS CHAR) FROM admission_major_lines WHERE admission_year=2025 AND province_name=@target_province; INSERT IGNORE INTO tmp_gc_old_review_keys SELECT 'score_rank', CAST(score_rank_id AS CHAR) FROM score_rank_points WHERE admission_year=2025 AND province_name=@target_province; INSERT IGNORE INTO tmp_gc_old_review_keys SELECT 'control_line', CAST(control_line_id AS CHAR) FROM control_score_lines WHERE admission_year=2025 AND province_name=@target_province; INSERT IGNORE INTO tmp_gc_old_review_keys SELECT 'cutoff_line', CAST(cutoff_line_id AS CHAR) FROM admission_cutoff_lines WHERE admission_year=2025 AND province_name=@target_province; INSERT IGNORE INTO tmp_gc_old_review_keys SELECT 'plan_release', CAST(plan_release_id AS CHAR) FROM admission_plan_releases WHERE admission_year=2025 AND province_name=@target_province; INSERT IGNORE INTO tmp_gc_old_review_keys SELECT 'dataset_coverage', CAST(coverage_id AS CHAR) FROM dataset_coverage WHERE admission_year=2025 AND province_name=@target_province; DELETE logs FROM review_audit_logs logs JOIN tmp_gc_old_review_keys old_key ON old_key.entity_type=logs.entity_type AND old_key.entity_key=logs.entity_key; DELETE reviews FROM review_records reviews JOIN tmp_gc_old_review_keys old_key ON old_key.entity_type=reviews.entity_type AND old_key.entity_key=reviews.entity_key; DELETE FROM admission_major_lines WHERE admission_year=2025 AND province_name=@target_province; DELETE plans FROM admission_major_plans plans JOIN admission_groups groups_ ON groups_.admission_group_id=plans.admission_group_id WHERE groups_.admission_year=2025 AND groups_.province_name=@target_province; DELETE FROM admission_cutoff_lines WHERE admission_year=2025 AND province_name=@target_province; DELETE FROM admission_groups WHERE admission_year=2025 AND province_name=@target_province; DELETE FROM admission_plan_releases WHERE admission_year=2025 AND province_name=@target_province; DELETE FROM score_rank_points WHERE admission_year=2025 AND province_name=@target_province; DELETE FROM control_score_lines WHERE admission_year=2025 AND province_name=@target_province; DELETE FROM dataset_coverage WHERE admission_year=2025 AND province_name=@target_province; INSERT INTO admission_plan_releases ( province_name, admission_year, release_title, plan_round, coverage_scope, published_on, source_id ) SELECT province_name, 2025, CONCAT(province_name, '2025年普通高校招生计划(GaokaoCompass快照)'), '初始', 'full_initial', NULL, MIN(source_id) FROM stg_gc_enrollment_plans WHERE admission_year=2025 GROUP BY province_name; INSERT IGNORE INTO admission_groups ( plan_release_id, province_name, admission_year, admission_category, subject_category, batch_name, segment_code, school_id, source_school_code, school_name_raw, group_code, group_name, source_id ) SELECT releases.plan_release_id, stage.province_name, 2025, '普通类', CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 128) END, schools.school_id, CASE WHEN stage.source_school_code IS NULL OR TRIM(stage.source_school_code) IN ('', '', 'nan') THEN '' ELSE LEFT(TRIM(stage.source_school_code), 16) END, LEFT(TRIM(stage.school_name_raw), 255), CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END, CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '来源未提供专业组' ELSE LEFT(TRIM(stage.group_code), 255) END, stage.source_id FROM stg_gc_enrollment_plans stage JOIN admission_plan_releases releases ON releases.province_name=stage.province_name AND releases.admission_year=2025 LEFT JOIN schools ON schools.official_name=TRIM(stage.school_name_raw) WHERE stage.admission_year=2025 AND stage.school_name_raw IS NOT NULL AND TRIM(stage.school_name_raw) NOT IN ('', '', 'nan'); INSERT IGNORE INTO admission_groups ( plan_release_id, province_name, admission_year, admission_category, subject_category, batch_name, segment_code, school_id, source_school_code, school_name_raw, group_code, group_name, source_id ) SELECT NULL, stage.province_name, 2025, '普通类', CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 128) END, schools.school_id, CASE WHEN stage.source_school_code IS NULL OR TRIM(stage.source_school_code) IN ('', '', 'nan') THEN '' ELSE LEFT(TRIM(stage.source_school_code), 16) END, LEFT(TRIM(stage.school_name_raw), 255), CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END, CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '来源未提供专业组' ELSE LEFT(TRIM(stage.group_code), 255) END, stage.source_id FROM stg_gc_school_admissions stage LEFT JOIN schools ON schools.official_name=TRIM(stage.school_name_raw) WHERE stage.admission_year=2025 AND stage.school_name_raw IS NOT NULL AND TRIM(stage.school_name_raw) NOT IN ('', '', 'nan'); INSERT IGNORE INTO admission_groups ( plan_release_id, province_name, admission_year, admission_category, subject_category, batch_name, segment_code, school_id, source_school_code, school_name_raw, group_code, group_name, source_id ) SELECT NULL, stage.province_name, 2025, '普通类', CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 128) END, schools.school_id, CASE WHEN stage.source_school_code IS NULL OR TRIM(stage.source_school_code) IN ('', '', 'nan') THEN '' ELSE LEFT(TRIM(stage.source_school_code), 16) END, LEFT(TRIM(stage.school_name_raw), 255), CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END, CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '来源未提供专业组' ELSE LEFT(TRIM(stage.group_code), 255) END, stage.source_id FROM stg_gc_major_admissions stage LEFT JOIN schools ON schools.official_name=TRIM(stage.school_name_raw) WHERE stage.admission_year=2025 AND stage.school_name_raw IS NOT NULL AND TRIM(stage.school_name_raw) NOT IN ('', '', 'nan'); INSERT INTO admission_major_plans ( admission_group_id, plan_release_id, major_code, major_name, subject_requirements, plan_count, tuition_yuan_per_year, study_years, campus_name, notes, source_row_number, source_id ) SELECT groups_.admission_group_id, releases.plan_release_id, CASE WHEN stage.major_code IS NULL OR TRIM(stage.major_code) IN ('', 'nan') THEN '' ELSE LEFT(TRIM(stage.major_code), 32) END, CASE WHEN stage.major_name IS NULL OR TRIM(stage.major_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.major_name), 255) END, CASE WHEN stage.subject_requirements IS NULL OR TRIM(stage.subject_requirements) IN ('', '', 'nan') THEN NULL ELSE LEFT(TRIM(stage.subject_requirements), 255) END, CASE WHEN TRIM(stage.plan_count_text) REGEXP '^[0-9]+(\\.0+)?$' THEN CAST(stage.plan_count_text AS UNSIGNED) ELSE NULL END, CASE WHEN TRIM(stage.tuition_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN CAST(stage.tuition_text AS DECIMAL(10,2)) ELSE NULL END, CASE TRIM(stage.study_duration) WHEN '一年' THEN 1 WHEN '二年' THEN 2 WHEN '两年' THEN 2 WHEN '三年' THEN 3 WHEN '四年' THEN 4 WHEN '五年' THEN 5 WHEN '六年' THEN 6 ELSE NULL END, NULL, CONCAT_WS(';', CASE WHEN stage.major_note IS NULL OR TRIM(stage.major_note) IN ('', '', 'nan') THEN NULL ELSE stage.major_note END, CASE WHEN stage.major_name IS NULL OR TRIM(stage.major_name) IN ('', '', 'nan') THEN '原始数据缺专业名称' END, CASE WHEN stage.plan_count_text IS NULL OR TRIM(stage.plan_count_text) IN ('', '', 'nan') THEN '原始数据缺计划人数' END ), stage.source_row_number, stage.source_id FROM stg_gc_enrollment_plans stage JOIN admission_plan_releases releases ON releases.province_name=stage.province_name AND releases.admission_year=2025 JOIN admission_groups groups_ ON groups_.province_name=stage.province_name AND groups_.admission_year=2025 AND groups_.admission_category='普通类' AND groups_.subject_category=CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END AND groups_.segment_code=CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 128) END AND groups_.source_school_code=CASE WHEN stage.source_school_code IS NULL OR TRIM(stage.source_school_code) IN ('', '', 'nan') THEN '' ELSE LEFT(TRIM(stage.source_school_code), 16) END AND groups_.group_code=CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END WHERE stage.admission_year=2025; INSERT INTO admission_cutoff_lines ( province_name, admission_year, admission_category, subject_category, education_level, batch_name, segment_code, school_id, source_school_code, school_name_raw, group_code, group_name, cutoff_score, cutoff_rank, control_score, score_diff, admit_count, school_province, school_nature, raw_total_score, source_row_number, source_id ) SELECT stage.province_name, 2025, '普通类', CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END, CASE WHEN stage.batch_name LIKE '%专科%' OR stage.batch_name LIKE '%高职%' THEN '高职专科' WHEN stage.batch_name LIKE '%本科%' THEN '本科' ELSE '其他' END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 128) END, schools.school_id, CASE WHEN stage.source_school_code IS NULL OR TRIM(stage.source_school_code) IN ('', '', 'nan') THEN '' ELSE LEFT(TRIM(stage.source_school_code), 16) END, LEFT(TRIM(stage.school_name_raw), 255), CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END, CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '来源未提供专业组' ELSE LEFT(TRIM(stage.group_code), 255) END, CASE WHEN TRIM(stage.min_score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN CAST(stage.min_score_text AS DECIMAL(7,2)) ELSE NULL END, CASE WHEN TRIM(stage.min_rank_text) REGEXP '^[0-9]+(\\.0+)?$' THEN CAST(stage.min_rank_text AS UNSIGNED) ELSE NULL END, CASE WHEN TRIM(stage.control_score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN CAST(stage.control_score_text AS DECIMAL(7,2)) ELSE NULL END, CASE WHEN TRIM(stage.score_diff_text) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(stage.score_diff_text AS DECIMAL(7,2)) ELSE NULL END, CASE WHEN TRIM(stage.admit_count_text) REGEXP '^[0-9]+(\\.0+)?$' THEN CAST(stage.admit_count_text AS UNSIGNED) ELSE NULL END, CASE WHEN stage.school_province IS NULL OR TRIM(stage.school_province) IN ('', '', 'nan') THEN NULL ELSE LEFT(TRIM(stage.school_province), 64) END, CASE WHEN stage.school_nature IS NULL OR TRIM(stage.school_nature) IN ('', '', 'nan') THEN NULL ELSE LEFT(TRIM(stage.school_nature), 32) END, CASE WHEN TRIM(stage.min_score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN CAST(stage.min_score_text AS DECIMAL(7,2)) ELSE NULL END, stage.source_row_number, stage.source_id FROM stg_gc_school_admissions stage LEFT JOIN schools ON schools.official_name=TRIM(stage.school_name_raw) WHERE stage.admission_year=2025 AND stage.school_name_raw IS NOT NULL AND TRIM(stage.school_name_raw) NOT IN ('', '', 'nan'); INSERT INTO admission_major_lines ( admission_group_id, province_name, admission_year, admission_category, subject_category, education_level, batch_name, source_school_code, school_name_raw, group_code, major_code, major_name, major_note, subject_requirements, min_score, min_rank, max_score, avg_score, admit_count, school_province, school_nature, is_985, is_211, school_id, source_row_number, source_id ) SELECT groups_.admission_group_id, stage.province_name, 2025, '普通类', CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 64) END, CASE WHEN stage.batch_name LIKE '%专科%' OR stage.batch_name LIKE '%高职%' THEN '高职专科' WHEN stage.batch_name LIKE '%本科%' THEN '本科' ELSE '其他' END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END, CASE WHEN stage.source_school_code IS NULL OR TRIM(stage.source_school_code) IN ('', '', 'nan') THEN '' ELSE LEFT(TRIM(stage.source_school_code), 32) END, LEFT(TRIM(stage.school_name_raw), 255), CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END, CASE WHEN stage.major_code IS NULL OR TRIM(stage.major_code) IN ('', 'nan') THEN '' ELSE LEFT(TRIM(stage.major_code), 64) END, LEFT(TRIM(stage.major_name), 255), CASE WHEN stage.major_note IS NULL OR TRIM(stage.major_note) IN ('', '', 'nan') THEN NULL ELSE stage.major_note END, CASE WHEN stage.subject_requirements IS NULL OR TRIM(stage.subject_requirements) IN ('', '', 'nan') THEN NULL ELSE LEFT(TRIM(stage.subject_requirements), 255) END, CASE WHEN TRIM(stage.min_score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN CAST(stage.min_score_text AS DECIMAL(7,2)) ELSE NULL END, CASE WHEN TRIM(stage.min_rank_text) REGEXP '^[0-9]+(\\.0+)?$' THEN CAST(stage.min_rank_text AS UNSIGNED) ELSE NULL END, CASE WHEN TRIM(stage.max_score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN CAST(stage.max_score_text AS DECIMAL(7,2)) ELSE NULL END, CASE WHEN TRIM(stage.avg_score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN CAST(stage.avg_score_text AS DECIMAL(7,2)) ELSE NULL END, CASE WHEN TRIM(stage.admit_count_text) REGEXP '^[0-9]+(\\.0+)?$' THEN CAST(stage.admit_count_text AS UNSIGNED) ELSE NULL END, CASE WHEN stage.school_province IS NULL OR TRIM(stage.school_province) IN ('', '', 'nan') THEN NULL ELSE LEFT(TRIM(stage.school_province), 64) END, CASE WHEN stage.school_nature IS NULL OR TRIM(stage.school_nature) IN ('', '', 'nan') THEN NULL ELSE LEFT(TRIM(stage.school_nature), 32) END, CASE WHEN TRIM(stage.is_985_text) IN ('0','1') THEN CAST(stage.is_985_text AS UNSIGNED) ELSE NULL END, CASE WHEN TRIM(stage.is_211_text) IN ('0','1') THEN CAST(stage.is_211_text AS UNSIGNED) ELSE NULL END, schools.school_id, stage.source_row_number, stage.source_id FROM stg_gc_major_admissions stage LEFT JOIN schools ON schools.official_name=TRIM(stage.school_name_raw) LEFT JOIN admission_groups groups_ ON groups_.province_name=stage.province_name AND groups_.admission_year=2025 AND groups_.admission_category='普通类' AND groups_.subject_category=CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END AND groups_.segment_code=CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 128) END AND groups_.source_school_code=CASE WHEN stage.source_school_code IS NULL OR TRIM(stage.source_school_code) IN ('', '', 'nan') THEN '' ELSE LEFT(TRIM(stage.source_school_code), 16) END AND groups_.group_code=CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END WHERE stage.admission_year=2025 AND stage.school_name_raw IS NOT NULL AND TRIM(stage.school_name_raw) NOT IN ('', '', 'nan') AND stage.major_name IS NOT NULL AND TRIM(stage.major_name) NOT IN ('', '', 'nan'); INSERT INTO score_rank_points ( province_name, admission_year, admission_category, subject_category, score, same_score_count, cumulative_count, rank_from, rank_to, source_sequence, source_id ) WITH sequenced AS ( SELECT stage.*, SUM(CASE WHEN NOT (TRIM(stage.score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$') AND TRIM(stage.cumulative_count_text) REGEXP '^[0-9]+(\\.0+)?$' THEN 1 ELSE 0 END) OVER ( PARTITION BY stage.province_name, CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END ORDER BY stage.source_row_number ) AS source_sequence_group FROM stg_gc_score_ranges stage WHERE stage.admission_year=2025 ), marked AS ( SELECT sequenced.*, MAX(CASE WHEN NOT (TRIM(sequenced.score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$') AND TRIM(sequenced.cumulative_count_text) REGEXP '^[0-9]+(\\.0+)?$' THEN CAST(sequenced.cumulative_count_text AS UNSIGNED) ELSE NULL END) OVER ( PARTITION BY sequenced.province_name, CASE WHEN sequenced.subject_category IS NULL OR TRIM(sequenced.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(sequenced.subject_category), 32) END, sequenced.source_sequence_group ) AS initial_cumulative_count FROM sequenced ), normalized AS ( SELECT stage.province_name, CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN CONCAT('未标注序列', GREATEST(stage.source_sequence_group, 1)) ELSE LEFT(TRIM(stage.subject_category), 32) END AS subject_category, CAST(stage.score_text AS DECIMAL(7,2)) AS score, MAX(CAST(stage.cumulative_count_text AS UNSIGNED)) AS cumulative_count, MAX(CASE WHEN TRIM(stage.segment_count_text) REGEXP '^[0-9]+(\\.0+)?$' THEN CAST(stage.segment_count_text AS UNSIGNED) ELSE NULL END) AS source_same_score_count, MIN(stage.initial_cumulative_count) AS initial_cumulative_count, MIN(stage.source_row_number) AS source_sequence, MIN(stage.source_id) AS source_id FROM marked stage WHERE TRIM(stage.score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' AND TRIM(stage.cumulative_count_text) REGEXP '^[0-9]+(\\.0+)?$' GROUP BY stage.province_name, CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN CONCAT('未标注序列', GREATEST(stage.source_sequence_group, 1)) ELSE LEFT(TRIM(stage.subject_category), 32) END, CAST(stage.score_text AS DECIMAL(7,2)) ), ranked AS ( SELECT normalized.*, COALESCE(LAG(cumulative_count) OVER ( PARTITION BY province_name, subject_category ORDER BY score DESC ), initial_cumulative_count, 0) AS previous_cumulative_count FROM normalized ), derived AS ( SELECT ranked.*, COALESCE(source_same_score_count, GREATEST(0, cumulative_count-previous_cumulative_count)) AS same_score_count FROM ranked ) SELECT province_name, 2025, '普通类', subject_category, score, same_score_count, cumulative_count, GREATEST(1, cumulative_count-same_score_count+1), cumulative_count, source_sequence, source_id FROM derived; INSERT IGNORE INTO control_score_lines ( province_name, admission_year, admission_category, subject_category, education_level, culture_score, professional_score, notes, source_id ) SELECT stage.province_name, 2025, '普通类', CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 128) END, CAST(stage.control_score_text AS DECIMAL(7,2)), NULL, '由GaokaoCompass一分一段CSV中的control_score字段导入,需结合省级考试院原文复核。', MIN(stage.source_id) FROM stg_gc_score_ranges stage WHERE stage.admission_year=2025 AND TRIM(stage.control_score_text) REGEXP '^[0-9]+(\\.[0-9]+)?$' GROUP BY stage.province_name, CASE WHEN stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END, CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 128) END, CAST(stage.control_score_text AS DECIMAL(7,2)); INSERT INTO dataset_coverage ( dataset_name, province_name, admission_year, admission_category, subject_category, segment_code, coverage_status, record_count, notes, source_id ) SELECT '专业招生计划', stage.province_name, 2025, '普通类', '', '', CASE WHEN SUM(stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan') OR stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan') OR stage.major_code IS NULL OR TRIM(stage.major_code) IN ('', '', 'nan')) > 0 THEN 'partial_public_snapshot' ELSE 'complete_public_snapshot' END, COUNT(*), CONCAT('GaokaoCompass 2025招生计划CSV;缺科类', SUM(stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan')), '条、缺专业组', SUM(stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan')), '条、缺专业代码', SUM(stage.major_code IS NULL OR TRIM(stage.major_code) IN ('', '', 'nan')), '条、缺专业名称', SUM(stage.major_name IS NULL OR TRIM(stage.major_name) IN ('', '', 'nan')), '条、缺计划人数', SUM(stage.plan_count_text IS NULL OR TRIM(stage.plan_count_text) IN ('', '', 'nan')), '条,全部进入待审核。'), MIN(stage.source_id) FROM stg_gc_enrollment_plans stage WHERE stage.admission_year=2025 GROUP BY stage.province_name; INSERT INTO dataset_coverage (dataset_name, province_name, admission_year, admission_category, subject_category, segment_code, coverage_status, record_count, notes, source_id) SELECT '院校专业组', groups_.province_name, 2025, '普通类', '', '', CASE WHEN SUM(groups_.group_code='未标注' OR groups_.subject_category='未标注')>0 THEN 'partial_public_snapshot' ELSE 'complete_public_snapshot' END, COUNT(*), CONCAT('由2025招生计划、院校投档线和专业录取线去重生成;未标注专业组', SUM(groups_.group_code='未标注'), '条。'), MIN(groups_.source_id) FROM admission_groups groups_ WHERE groups_.admission_year=2025 AND groups_.province_name=@target_province GROUP BY groups_.province_name; INSERT INTO dataset_coverage (dataset_name, province_name, admission_year, admission_category, subject_category, segment_code, coverage_status, record_count, notes, source_id) SELECT '院校专业组投档线', stage.province_name, 2025, '普通类', '', '', 'complete_public_snapshot', (SELECT COUNT(*) FROM admission_cutoff_lines cutoff_rows WHERE cutoff_rows.admission_year=2025 AND cutoff_rows.province_name=stage.province_name), CONCAT('GaokaoCompass 2025院校投档线CSV共', COUNT(*), '条;缺院校名称而未入业务表', SUM(stage.school_name_raw IS NULL OR TRIM(stage.school_name_raw) IN ('', '', 'nan')), '条;缺专业组', SUM(stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '', 'nan')), '条。'), MIN(stage.source_id) FROM stg_gc_school_admissions stage WHERE stage.admission_year=2025 GROUP BY stage.province_name; INSERT INTO dataset_coverage (dataset_name, province_name, admission_year, admission_category, subject_category, segment_code, coverage_status, record_count, notes, source_id) SELECT '专业录取线', stage.province_name, 2025, '普通类', '', '', 'complete_public_snapshot', COUNT(*), CONCAT('GaokaoCompass 2025专业录取线CSV,全部进入待审核;缺专业代码', SUM(stage.major_code IS NULL OR TRIM(stage.major_code) IN ('', '', 'nan')), '条。'), MIN(stage.source_id) FROM stg_gc_major_admissions stage WHERE stage.admission_year=2025 GROUP BY stage.province_name; INSERT INTO dataset_coverage (dataset_name, province_name, admission_year, admission_category, subject_category, segment_code, coverage_status, record_count, notes, source_id) SELECT '一分一段', stage.province_name, 2025, '普通类', '', '', CASE WHEN SUM(stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan'))>0 THEN 'partial_public_snapshot' ELSE 'complete_public_snapshot' END, (SELECT COUNT(*) FROM score_rank_points points WHERE points.admission_year=2025 AND points.province_name=stage.province_name), CONCAT('GaokaoCompass 2025一分一段CSV原始', COUNT(*), '条;按科类和分数去重、数值校验后入库', (SELECT COUNT(*) FROM score_rank_points points WHERE points.admission_year=2025 AND points.province_name=stage.province_name), '条;缺科类标签', SUM(stage.subject_category IS NULL OR TRIM(stage.subject_category) IN ('', '', 'nan')), '条。'), MIN(stage.source_id) FROM stg_gc_score_ranges stage WHERE stage.admission_year=2025 GROUP BY stage.province_name; INSERT INTO dataset_coverage (dataset_name, province_name, admission_year, admission_category, subject_category, segment_code, coverage_status, record_count, notes, source_id) SELECT '普通类控制线', control_rows.province_name, 2025, '普通类', '', '', 'partial_public_snapshot', COUNT(*), '由GaokaoCompass一分一段文件的control_score字段生成,需与省级考试院官方控制线复核。', MIN(control_rows.source_id) FROM control_score_lines control_rows WHERE control_rows.admission_year=2025 AND control_rows.province_name=@target_province GROUP BY control_rows.province_name; INSERT IGNORE INTO dataset_coverage ( dataset_name, province_name, admission_year, admission_category, subject_category, segment_code, coverage_status, record_count, notes, source_id ) SELECT names.dataset_name, scopes.province_name, 2025, '普通类', '', '', 'unavailable_publicly', 0, CONCAT('GaokaoCompass 2025快照未提供该省份的', names.dataset_name, '文件或有效记录。'), NULL FROM collection_scopes scopes CROSS JOIN ( SELECT '专业招生计划' dataset_name UNION ALL SELECT '院校专业组' UNION ALL SELECT '院校专业组投档线' UNION ALL SELECT '专业录取线' UNION ALL SELECT '一分一段' UNION ALL SELECT '普通类控制线' ) names WHERE scopes.admission_year=2025 AND scopes.province_name=@target_province; UPDATE collection_scopes scopes SET collection_status='collected', priority_level='high', status_note=CONCAT( 'GaokaoCompass 2025全国快照已覆盖:专业计划', (SELECT COUNT(*) FROM admission_major_plans plans JOIN admission_groups groups_ ON groups_.admission_group_id=plans.admission_group_id WHERE groups_.province_name=scopes.province_name AND groups_.admission_year=2025), '条、专业组', (SELECT COUNT(*) FROM admission_groups groups_ WHERE groups_.province_name=scopes.province_name AND groups_.admission_year=2025), '条、院校投档线', (SELECT COUNT(*) FROM admission_cutoff_lines cutoff_rows WHERE cutoff_rows.province_name=scopes.province_name AND cutoff_rows.admission_year=2025), '条、专业录取线', (SELECT COUNT(*) FROM admission_major_lines major_rows WHERE major_rows.province_name=scopes.province_name AND major_rows.admission_year=2025), '条、一分一段', (SELECT COUNT(*) FROM score_rank_points points WHERE points.province_name=scopes.province_name AND points.admission_year=2025), '条;均为待审核数据。'), first_collected_at=COALESCE(first_collected_at, NOW()), last_collected_at=NOW() WHERE scopes.admission_year=2025 AND scopes.province_name=@target_province; INSERT INTO ingestion_runs ( ingestion_run_id, source_id, dataset_name, dataset_year, started_at, finished_at, status, rows_read, rows_inserted, rows_updated, rows_rejected, message ) SELECT UUID(), source_id, 'GaokaoCompass 2025招生计划', 2025, NOW(), NOW(), 'success', COUNT(*), COUNT(*), 0, 0, '开放数据集CSV覆盖导入;数据进入待审核状态。' FROM stg_gc_enrollment_plans GROUP BY source_id; INSERT INTO ingestion_runs ( ingestion_run_id, source_id, dataset_name, dataset_year, started_at, finished_at, status, rows_read, rows_inserted, rows_updated, rows_rejected, message ) SELECT UUID(), source_id, 'GaokaoCompass 2025院校投档线', 2025, NOW(), NOW(), 'success', COUNT(*), COUNT(*), 0, 0, '开放数据集CSV覆盖导入;数据进入待审核状态。' FROM stg_gc_school_admissions GROUP BY source_id; INSERT INTO ingestion_runs ( ingestion_run_id, source_id, dataset_name, dataset_year, started_at, finished_at, status, rows_read, rows_inserted, rows_updated, rows_rejected, message ) SELECT UUID(), source_id, 'GaokaoCompass 2025专业录取线', 2025, NOW(), NOW(), 'success', COUNT(*), COUNT(*), 0, 0, '开放数据集CSV覆盖导入;数据进入待审核状态。' FROM stg_gc_major_admissions GROUP BY source_id; INSERT INTO ingestion_runs ( ingestion_run_id, source_id, dataset_name, dataset_year, started_at, finished_at, status, rows_read, rows_inserted, rows_updated, rows_rejected, message ) SELECT UUID(), source_id, 'GaokaoCompass 2025一分一段', 2025, NOW(), NOW(), 'success', COUNT(*), COUNT(*), 0, 0, '开放数据集CSV覆盖导入;数据进入待审核状态。' FROM stg_gc_score_ranges GROUP BY source_id; COMMIT; TRUNCATE TABLE stg_gc_enrollment_plans; TRUNCATE TABLE stg_gc_school_admissions; TRUNCATE TABLE stg_gc_major_admissions; TRUNCATE TABLE stg_gc_score_ranges;