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
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;
|
|
|