有关志愿通的代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

472 lines
32 KiB

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 ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END,
CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END,
CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END,
CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '<NA>', '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 ('', '<NA>', '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 ('<NA>', 'nan')
THEN '' ELSE LEFT(TRIM(stage.major_code), 32) END,
CASE WHEN stage.major_name IS NULL OR TRIM(stage.major_name) IN ('', '<NA>', 'nan')
THEN '未标注' ELSE LEFT(TRIM(stage.major_name), 255) END,
CASE WHEN stage.subject_requirements IS NULL OR TRIM(stage.subject_requirements) IN ('', '<NA>', '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 ('', '<NA>', 'nan') THEN NULL ELSE stage.major_note END,
CASE WHEN stage.major_name IS NULL OR TRIM(stage.major_name) IN ('', '<NA>', 'nan') THEN '原始数据缺专业名称' END,
CASE WHEN stage.plan_count_text IS NULL OR TRIM(stage.plan_count_text) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.batch_name), 255) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END,
CASE WHEN stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '<NA>', '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 ('', '<NA>', 'nan') THEN NULL ELSE LEFT(TRIM(stage.school_province), 64) END,
CASE WHEN stage.school_nature IS NULL OR TRIM(stage.school_nature) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.group_code), 64) END,
CASE WHEN stage.major_code IS NULL OR TRIM(stage.major_code) IN ('<NA>', '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 ('', '<NA>', 'nan') THEN NULL ELSE stage.major_note END,
CASE WHEN stage.subject_requirements IS NULL OR TRIM(stage.subject_requirements) IN ('', '<NA>', '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 ('', '<NA>', 'nan') THEN NULL ELSE LEFT(TRIM(stage.school_province), 64) END,
CASE WHEN stage.school_nature IS NULL OR TRIM(stage.school_nature) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan')
AND stage.major_name IS NOT NULL AND TRIM(stage.major_name) NOT IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', '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 ('', '<NA>', 'nan') THEN '未标注' ELSE LEFT(TRIM(stage.subject_category), 32) END,
CASE WHEN stage.batch_name IS NULL OR TRIM(stage.batch_name) IN ('', '<NA>', '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 ('', '<NA>', 'nan')
OR stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '<NA>', 'nan')
OR stage.major_code IS NULL OR TRIM(stage.major_code) IN ('', '<NA>', '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 ('', '<NA>', 'nan')),
'条、缺专业组', SUM(stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '<NA>', 'nan')),
'条、缺专业代码', SUM(stage.major_code IS NULL OR TRIM(stage.major_code) IN ('', '<NA>', 'nan')),
'条、缺专业名称', SUM(stage.major_name IS NULL OR TRIM(stage.major_name) IN ('', '<NA>', 'nan')),
'条、缺计划人数', SUM(stage.plan_count_text IS NULL OR TRIM(stage.plan_count_text) IN ('', '<NA>', '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 ('', '<NA>', 'nan')),
'条;缺专业组', SUM(stage.group_code IS NULL OR TRIM(stage.group_code) IN ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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 ('', '<NA>', '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;