Files
CapacityReport/CellData.sql
T

85 lines
4.9 KiB
SQL
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- CellData 数据处理脚本(在 celldata 库执行)
-- 1) 规范化 cellinfo.带宽
-- 2) 由 cellinfo 逆推 sector(扇区/物理站/制式/频段/带宽/站型/网络)
-- —— 不清空 sector,仅补充缺失 CGI,已有行(含人工修正)保留不覆盖
-- 依赖的结构表(cellinfo / sector / 频段特征库 sector_band_ref)由程序前置检查
-- (app/db_init.py + db_init/ 目录)保证存在,缺表会自动按预设建好;sector_band_ref
-- 一经创建即持久保留,可在数据库中自行增改频段规则,本脚本不再重建以免冲掉自定义。
-- 逆推规则与准确率见 docs/sector_inference_research.md
-- =============================================================================
-- 1. 带宽规范化:空值补 0M,统一大写并以 M 结尾(如 20M)
UPDATE cellinfo SET `带宽` = IF(`带宽` IS NULL OR `带宽` = '', '0M', CONCAT(REPLACE(UPPER(`带宽`),'M',''), 'M'));
-- 2. 逆推暂存表:预处理小区名称(全角括号->半角、【】->()、去空格/制表符)
DROP TABLE IF EXISTS _sector_infer;
CREATE TABLE _sector_infer AS
SELECT
c.CGI, c.`网络`, c.`带宽`, c.PLMN, c.`频点`, c.`制式` AS ci_zs,
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
c.`小区名称`,' ',''),CHAR(9),''),' ',''),'(','('),')',')'),'【','('),'】',')') AS name1
FROM cellinfo c;
ALTER TABLE _sector_infer
ADD COLUMN `制式` varchar(20),
ADD COLUMN `频段` varchar(20),
ADD COLUMN `站型` varchar(10),
ADD COLUMN numstr varchar(20),
ADD COLUMN base varchar(220),
ADD COLUMN `物理站` varchar(200),
ADD COLUMN `扇区` varchar(210);
-- 2.1 设备码([频率前缀]-Z[xx]-[扇区号])剥离得到 base;尾部数字串;站型判定
-- 站型:设备码尾字母 W=室分;名称含"微小"=微站;其余=宏站
UPDATE _sector_infer SET
base = REGEXP_REPLACE(name1,'[A-Z0-9]+-Z[A-Z0-9]{2}-[0-9]+$',''),
numstr = REGEXP_SUBSTR(name1,'[0-9]+$'),
`站型` = CASE
WHEN name1 REGEXP 'Z[A-Z]W-[0-9]+$' THEN '室分'
WHEN name1 LIKE '%微小%' THEN '微站'
ELSE '宏站' END;
-- 2.2 制式/频段:按特征库匹配;未命中回落 cellinfo 原制式
UPDATE _sector_infer t
JOIN sector_band_ref r
ON r.`网络` COLLATE utf8mb4_unicode_ci = t.`网络` COLLATE utf8mb4_unicode_ci
AND CAST(NULLIF(t.`频点`,'') AS DECIMAL(10,2)) >= r.`频点下限`
AND CAST(NULLIF(t.`频点`,'') AS DECIMAL(10,2)) < r.`频点上限`
AND (r.`PLMN` IS NULL OR r.`PLMN` COLLATE utf8mb4_unicode_ci = t.PLMN COLLATE utf8mb4_unicode_ci)
SET t.`制式` = r.`制式`, t.`频段` = r.`频段`;
UPDATE _sector_infer SET `制式` = ci_zs, `频段` = ci_zs WHERE `制式` IS NULL;
-- 2.3 物理站(非 700M/广电):去码后删全部括号注记,保留(微小X)并回贴;
-- 再去掉不闭合的悬空开括号与孤立右括号
UPDATE _sector_infer SET `物理站` = CONCAT(
TRIM(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(
base,'\\([^()]*\\)',''),'\\([^()]*\\)',''),'\\([^()]*\\)',''),'\\([^()]*$',''),'[)]+$',''),'^[)]+','')),
IFNULL(REGEXP_SUBSTR(name1,'[(]微小[A-Z]?[)]'),''))
WHERE `制式` IS NULL OR `制式` NOT IN ('700M','广电');
-- 2.4 物理站(700M/广电):真实站址在括号内,且与外层同「地市」前缀(小区名开头即地市,通用不限江门)。
-- 取外层名(去 CBN-)的前 2 个字作为地市前缀,匹配以该前缀开头的括号内容为物理站;
-- 无匹配则取外层(共建/从…拉远等注记括号因不以地市开头,自然落到外层)。
UPDATE _sector_infer SET `物理站` =
CASE WHEN REGEXP_SUBSTR(base, CONCAT('\\(', LEFT(REGEXP_REPLACE(REGEXP_REPLACE(base,'\\(.*$',''),'^CBN-?',''), 2), '[^()]*')) <> ''
THEN TRIM(SUBSTRING(REGEXP_SUBSTR(base, CONCAT('\\(', LEFT(REGEXP_REPLACE(REGEXP_REPLACE(base,'\\(.*$',''),'^CBN-?',''), 2), '[^()]*')), 2))
ELSE TRIM(REGEXP_REPLACE(REGEXP_REPLACE(base,'\\(.*$',''),'^CBN-?','')) END
WHERE `制式` IN ('700M','广电');
-- 2.5 扇区 = 物理站 + 扇区号(700M/广电取末位数字;其余取数字串 % 100)
UPDATE _sector_infer SET `扇区` = CONCAT(`物理站`,
CASE WHEN numstr IS NULL OR numstr = '' THEN ''
WHEN `制式` IN ('700M','广电') THEN RIGHT(numstr,1)
ELSE CAST(CAST(numstr AS UNSIGNED) % 100 AS CHAR) END);
-- 3. 补缺写回 sector:仅插入 sector 中尚不存在的 CGI
-- 已存在的 CGI 一律保留,避免人工修正(如 3DMM、人工纠正的物理站/带宽)被覆盖
INSERT INTO sector (CGI,`扇区`,`物理站`,`制式`,`频段`,`带宽`,`站型`,`网络`)
SELECT i.CGI, i.`扇区`, i.`物理站`, i.`制式`, i.`频段`, i.`带宽`, i.`站型`, i.`网络`
FROM _sector_infer i
LEFT JOIN sector s ON s.CGI = i.CGI
WHERE s.CGI IS NULL;
DROP TABLE _sector_infer;