ctc_poc2026/POC-TSG匹配测试用例_DMK库表DDL(1).sql

1788 lines
105 KiB
MySQL
Raw Permalink Normal View History

2026-05-02 04:19:05 -04:00
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE SCHEMA IF NOT EXISTS dmk;
-- =========================================================
-- 1. 通用维度与配置表
-- =========================================================
CREATE TABLE IF NOT EXISTS dmk.td_account_period (
data_type integer NOT NULL,
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
is_current boolean NOT NULL DEFAULT false,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (data_type, year_month)
);
COMMENT ON TABLE dmk.td_account_period IS '可查询账期维表,支撑 /api/common/account-periods。';
COMMENT ON COLUMN dmk.td_account_period.data_type IS '数据来源类型,对应字典 data_type区分 OTT/工参/用户等不同数据源';
COMMENT ON COLUMN dmk.td_account_period.year_month IS '账期,格式 YYYY-MM统一月粒度';
COMMENT ON COLUMN dmk.td_account_period.year IS '账期年份,冗余于 year_month';
COMMENT ON COLUMN dmk.td_account_period.month IS '账期月份(1-12),冗余于 year_month';
COMMENT ON COLUMN dmk.td_account_period.is_current IS '是否当前最新账期true 表示该数据源当前默认账期';
COMMENT ON COLUMN dmk.td_account_period.is_valid IS '是否有效1=有效 0=无效(逻辑删除)';
COMMENT ON COLUMN dmk.td_account_period.updated_time IS '记录更新时间';
CREATE TABLE IF NOT EXISTS dmk.td_region (
region_code integer PRIMARY KEY,
region_name varchar(64) NOT NULL,
region_level varchar(16) NOT NULL,
parent_region_code integer,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
center_lon numeric(10, 6),
center_lat numeric(10, 6),
bbox numeric(10, 6)[],
region_wkt text,
region_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
CASE WHEN region_wkt IS NULL THEN NULL
ELSE ST_Multi(ST_GeomFromText(region_wkt, 4326))::geometry(MultiPolygon, 4326)
END
) STORED,
sort_no integer NOT NULL DEFAULT 0,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
CHECK (region_level IN ('nation', 'province', 'city', 'district'))
);
COMMENT ON TABLE dmk.td_region IS '行政区域维表,保留区域树、区域 WKT 和区域空间索引字段。';
COMMENT ON COLUMN dmk.td_region.region_code IS '区域编码,全国/省/市/区县统一主键';
COMMENT ON COLUMN dmk.td_region.region_name IS '区域名称';
COMMENT ON COLUMN dmk.td_region.region_level IS '区域级别nation/province/city/district';
COMMENT ON COLUMN dmk.td_region.parent_region_code IS '父级区域编码,用于构造区域树';
COMMENT ON COLUMN dmk.td_region.provincecode IS '省编码(冗余)';
COMMENT ON COLUMN dmk.td_region.province_name IS '省名称(冗余)';
COMMENT ON COLUMN dmk.td_region.citycode IS '地市编码(冗余)';
COMMENT ON COLUMN dmk.td_region.city_name IS '地市名称(冗余)';
COMMENT ON COLUMN dmk.td_region.districtcode IS '区县编码(冗余)';
COMMENT ON COLUMN dmk.td_region.district_name IS '区县名称(冗余)';
COMMENT ON COLUMN dmk.td_region.center_lon IS '区域中心点经度EPSG:4326';
COMMENT ON COLUMN dmk.td_region.center_lat IS '区域中心点纬度EPSG:4326';
COMMENT ON COLUMN dmk.td_region.bbox IS '区域外接矩形 [minLon,minLat,maxLon,maxLat],便于地图视野初始化';
COMMENT ON COLUMN dmk.td_region.region_wkt IS '区域多边形 WKTEPSG:4326';
COMMENT ON COLUMN dmk.td_region.region_geom IS '由 region_wkt 生成的 MultiPolygon 几何列,用于 GiST 空间索引和空间过滤';
COMMENT ON COLUMN dmk.td_region.sort_no IS '区域显示排序号';
COMMENT ON COLUMN dmk.td_region.is_valid IS '是否有效1=有效 0=无效';
COMMENT ON COLUMN dmk.td_region.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_td_region_parent ON dmk.td_region(parent_region_code, region_level, sort_no);
CREATE INDEX IF NOT EXISTS idx_td_region_geom ON dmk.td_region USING gist(region_geom) WHERE region_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.td_dict_item (
dict_type varchar(64) NOT NULL,
dict_code varchar(64) NOT NULL,
dict_name varchar(128) NOT NULL,
dict_desc text,
sort_no integer NOT NULL DEFAULT 0,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (dict_type, dict_code)
);
COMMENT ON TABLE dmk.td_dict_item IS '通用字典维表,覆盖 data_type、operator_name、network_class、scene_type 等枚举。';
COMMENT ON COLUMN dmk.td_dict_item.dict_type IS '字典类型编码,如 data_type、operator_name、network_class、scene_type 等';
COMMENT ON COLUMN dmk.td_dict_item.dict_code IS '字典项编码';
COMMENT ON COLUMN dmk.td_dict_item.dict_name IS '字典项名称(用于前端展示)';
COMMENT ON COLUMN dmk.td_dict_item.dict_desc IS '字典项描述/补充说明;初始化字典中同类型记录可统一保存字典类型名称,供 /api/common/dict/types 返回';
COMMENT ON COLUMN dmk.td_dict_item.sort_no IS '同类型下的排序号';
COMMENT ON COLUMN dmk.td_dict_item.is_valid IS '是否有效1=有效 0=无效';
COMMENT ON COLUMN dmk.td_dict_item.updated_time IS '记录更新时间';
CREATE TABLE IF NOT EXISTS dmk.td_metric_definition (
module_code varchar(64) NOT NULL,
metric_code varchar(64) NOT NULL,
threshold varchar(32) NOT NULL DEFAULT '',
metric_group varchar(64),
metric_name varchar(128) NOT NULL,
metric_desc text,
formula text,
source_table varchar(128),
unit varchar(32),
is_default boolean NOT NULL DEFAULT false,
sort_no integer NOT NULL DEFAULT 0,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (module_code, metric_code, threshold)
);
COMMENT ON TABLE dmk.td_metric_definition IS '指标口径维表threshold 用于区分 -105/-110 等不同覆盖口径。';
COMMENT ON COLUMN dmk.td_metric_definition.module_code IS '指标所属模块编码(如 grid、building、scene、cluster、poor 等)';
COMMENT ON COLUMN dmk.td_metric_definition.metric_code IS '指标编码(如 mr_cover_rate、avgrsrp 等)';
COMMENT ON COLUMN dmk.td_metric_definition.threshold IS '阈值标识,如 -105/-110用于区分同名指标的不同口径无阈值时为空串';
COMMENT ON COLUMN dmk.td_metric_definition.metric_group IS '指标分组(如 coverage、user、quality 等)';
COMMENT ON COLUMN dmk.td_metric_definition.metric_name IS '指标显示名称';
COMMENT ON COLUMN dmk.td_metric_definition.metric_desc IS '指标说明/口径描述(用于报表口径弹窗)';
COMMENT ON COLUMN dmk.td_metric_definition.formula IS '计算公式描述';
COMMENT ON COLUMN dmk.td_metric_definition.source_table IS '指标来源表说明';
COMMENT ON COLUMN dmk.td_metric_definition.unit IS '指标单位(如 %、dBm、个、GB 等)';
COMMENT ON COLUMN dmk.td_metric_definition.is_default IS '是否为模块默认展示指标';
COMMENT ON COLUMN dmk.td_metric_definition.sort_no IS '同模块下的排序号';
COMMENT ON COLUMN dmk.td_metric_definition.is_valid IS '是否有效1=有效 0=无效';
COMMENT ON COLUMN dmk.td_metric_definition.updated_time IS '记录更新时间';
CREATE TABLE IF NOT EXISTS dmk.td_layer_config (
layer_type varchar(32) NOT NULL,
layer_role varchar(32) NOT NULL DEFAULT 'base',
render_mode varchar(16) NOT NULL DEFAULT '2D',
workspace varchar(64) NOT NULL DEFAULT 'ott',
layer_name varchar(128) NOT NULL,
default_style_name varchar(128) NOT NULL,
wms_url varchar(256) NOT NULL DEFAULT '/geoserver/ott/wms',
wms_version varchar(16) NOT NULL DEFAULT '1.1.1',
wms_format varchar(64) NOT NULL DEFAULT 'image/png',
wms_transparent boolean NOT NULL DEFAULT true,
wms_srs varchar(32) NOT NULL DEFAULT 'EPSG:4326',
wms_tiled boolean NOT NULL DEFAULT true,
wms_tile_size integer NOT NULL DEFAULT 256,
wms_min_zoom integer NOT NULL DEFAULT 8,
wms_max_zoom integer NOT NULL DEFAULT 19,
wms_opacity numeric(4, 2) NOT NULL DEFAULT 0.9,
geom_column varchar(64) NOT NULL,
cql_template text,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (layer_type, layer_role, render_mode)
);
COMMENT ON TABLE dmk.td_layer_config IS 'GeoServer WMS 图层配置表Java 服务基于该表和白名单字段生成 layer_config。';
COMMENT ON COLUMN dmk.td_layer_config.layer_type IS '图层类型building/grid/scene/cell/cluster/poor 等)';
COMMENT ON COLUMN dmk.td_layer_config.layer_role IS '图层角色base=基础图层 view=视图层 publish=发布层';
COMMENT ON COLUMN dmk.td_layer_config.render_mode IS '渲染模式2D / 3D';
COMMENT ON COLUMN dmk.td_layer_config.workspace IS 'GeoServer 工作空间,默认 ott';
COMMENT ON COLUMN dmk.td_layer_config.layer_name IS 'GeoServer 图层名称workspace:layer 中的 layer 部分)';
COMMENT ON COLUMN dmk.td_layer_config.default_style_name IS '默认 SLD 样式名称';
COMMENT ON COLUMN dmk.td_layer_config.wms_url IS 'WMS 服务地址,默认 /geoserver/ott/wms';
COMMENT ON COLUMN dmk.td_layer_config.wms_version IS 'WMS 协议版本,默认 1.1.1';
COMMENT ON COLUMN dmk.td_layer_config.wms_format IS 'WMS 图片格式,默认 image/png';
COMMENT ON COLUMN dmk.td_layer_config.wms_transparent IS '是否透明背景,默认 true';
COMMENT ON COLUMN dmk.td_layer_config.wms_srs IS '坐标参考系,默认 EPSG:4326';
COMMENT ON COLUMN dmk.td_layer_config.wms_tiled IS '是否使用瓦片模式,默认 true';
COMMENT ON COLUMN dmk.td_layer_config.wms_tile_size IS '瓦片尺寸(像素),默认 256';
COMMENT ON COLUMN dmk.td_layer_config.wms_min_zoom IS '图层最小缩放级别,默认 8';
COMMENT ON COLUMN dmk.td_layer_config.wms_max_zoom IS '图层最大缩放级别,默认 19';
COMMENT ON COLUMN dmk.td_layer_config.wms_opacity IS '图层默认透明度0.0~1.0),默认 0.9';
COMMENT ON COLUMN dmk.td_layer_config.geom_column IS '发布所用几何列名(如 grid_geom/aoi_geom视图层可统一别名为 geom';
COMMENT ON COLUMN dmk.td_layer_config.cql_template IS 'CQL 过滤模板,由 Java 服务基于白名单字段拼装时填充';
COMMENT ON COLUMN dmk.td_layer_config.is_valid IS '是否有效1=有效 0=无效';
COMMENT ON COLUMN dmk.td_layer_config.updated_time IS '记录更新时间';
CREATE TABLE IF NOT EXISTS dmk.td_layer_metric (
layer_type varchar(32) NOT NULL,
metric_code varchar(64) NOT NULL,
metric_name varchar(128) NOT NULL,
default_style_name varchar(128) NOT NULL,
supported_operator varchar(32)[] NOT NULL DEFAULT ARRAY[]::varchar[],
supported_network_class varchar(32)[] NOT NULL DEFAULT ARRAY[]::varchar[],
sort_no integer NOT NULL DEFAULT 0,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (layer_type, metric_code)
);
COMMENT ON TABLE dmk.td_layer_metric IS '图层指标白名单配置表,支撑 /api/common/layer-metrics。';
COMMENT ON COLUMN dmk.td_layer_metric.layer_type IS '图层类型,对应 td_layer_config.layer_type';
COMMENT ON COLUMN dmk.td_layer_metric.metric_code IS '指标编码,对应 td_metric_definition.metric_code';
COMMENT ON COLUMN dmk.td_layer_metric.metric_name IS '指标显示名称';
COMMENT ON COLUMN dmk.td_layer_metric.default_style_name IS '该指标默认 SLD 样式名称';
COMMENT ON COLUMN dmk.td_layer_metric.supported_operator IS '支持的运营商列表(数组),为空表示全部';
COMMENT ON COLUMN dmk.td_layer_metric.supported_network_class IS '支持的网络制式列表(数组),如 4G/5G_SA/all';
COMMENT ON COLUMN dmk.td_layer_metric.sort_no IS '同图层下指标排序号';
COMMENT ON COLUMN dmk.td_layer_metric.is_valid IS '是否有效1=有效 0=无效';
COMMENT ON COLUMN dmk.td_layer_metric.updated_time IS '记录更新时间';
CREATE TABLE IF NOT EXISTS dmk.td_layer_legend (
legend_id varchar(64) PRIMARY KEY,
account_id varchar(64) NOT NULL,
layer_type varchar(32) NOT NULL,
metric_code varchar(64) NOT NULL,
legend_name varchar(128) NOT NULL,
ranges jsonb NOT NULL,
is_default boolean NOT NULL DEFAULT false,
updated_by varchar(64),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
is_deleted smallint NOT NULL DEFAULT 0
);
COMMENT ON TABLE dmk.td_layer_legend IS '账号维度自定义图例表ranges 保存颜色、区间、标签配置。';
COMMENT ON COLUMN dmk.td_layer_legend.legend_id IS '图例主键 ID';
COMMENT ON COLUMN dmk.td_layer_legend.account_id IS '账号 ID自定义图例归属用户';
COMMENT ON COLUMN dmk.td_layer_legend.layer_type IS '图层类型';
COMMENT ON COLUMN dmk.td_layer_legend.metric_code IS '指标编码';
COMMENT ON COLUMN dmk.td_layer_legend.legend_name IS '图例名称';
COMMENT ON COLUMN dmk.td_layer_legend.ranges IS '图例配置 JSON包含颜色、区间、标签等';
COMMENT ON COLUMN dmk.td_layer_legend.is_default IS '是否为该用户默认图例';
COMMENT ON COLUMN dmk.td_layer_legend.updated_by IS '最后更新人账号';
COMMENT ON COLUMN dmk.td_layer_legend.updated_time IS '记录更新时间';
COMMENT ON COLUMN dmk.td_layer_legend.is_deleted IS '是否已删除0=未删除 1=已删除(逻辑删除)';
CREATE INDEX IF NOT EXISTS idx_td_layer_legend_query ON dmk.td_layer_legend(account_id, layer_type, metric_code, is_deleted);
-- =========================================================
-- 2. 空间基础维度表
-- =========================================================
CREATE TABLE IF NOT EXISTS dmk.td_grid (
regionid varchar(64) NOT NULL,
x_offset_20 varchar(32) NOT NULL,
y_offset_20 varchar(32) NOT NULL,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
center_lon numeric(10, 6),
center_lat numeric(10, 6),
grid_wkt text,
grid_geom geometry(Polygon, 4326) GENERATED ALWAYS AS (
CASE WHEN grid_wkt IS NULL THEN NULL
ELSE ST_GeomFromText(grid_wkt, 4326)::geometry(Polygon, 4326)
END
) STORED,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (regionid, x_offset_20, y_offset_20)
);
COMMENT ON TABLE dmk.td_grid IS '栅格基础维表,保留 WKT 和生成 geometry 用于空间关联。';
COMMENT ON COLUMN dmk.td_grid.regionid IS '栅格所属区域 ID';
COMMENT ON COLUMN dmk.td_grid.x_offset_20 IS '栅格 X 偏移20m 网格编码)';
COMMENT ON COLUMN dmk.td_grid.y_offset_20 IS '栅格 Y 偏移20m 网格编码)';
COMMENT ON COLUMN dmk.td_grid.provincecode IS '省编码';
COMMENT ON COLUMN dmk.td_grid.province_name IS '省名称';
COMMENT ON COLUMN dmk.td_grid.citycode IS '地市编码';
COMMENT ON COLUMN dmk.td_grid.city_name IS '地市名称';
COMMENT ON COLUMN dmk.td_grid.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.td_grid.district_name IS '区县名称';
COMMENT ON COLUMN dmk.td_grid.center_lon IS '栅格中心点经度EPSG:4326';
COMMENT ON COLUMN dmk.td_grid.center_lat IS '栅格中心点纬度EPSG:4326';
COMMENT ON COLUMN dmk.td_grid.grid_wkt IS '栅格多边形 WKTEPSG:4326';
COMMENT ON COLUMN dmk.td_grid.grid_geom IS '由 grid_wkt 生成的 Polygon 几何列,用于 GiST 空间索引';
COMMENT ON COLUMN dmk.td_grid.is_valid IS '是否有效1=有效 0=无效';
COMMENT ON COLUMN dmk.td_grid.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_td_grid_region ON dmk.td_grid(provincecode, citycode, districtcode);
CREATE INDEX IF NOT EXISTS idx_td_grid_geom ON dmk.td_grid USING gist(grid_geom) WHERE grid_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.td_cell_param_m (
year_month varchar(7) NOT NULL,
data_type integer,
operator_name varchar(32),
network_class varchar(32) NOT NULL,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
cellkey varchar(64) NOT NULL,
cell_name varchar(128),
cell_lon numeric(10, 6),
cell_lat numeric(10, 6),
cell_wkt text,
cell_geom geometry(Point, 4326) GENERATED ALWAYS AS (
CASE WHEN cell_wkt IS NOT NULL THEN ST_GeomFromText(cell_wkt, 4326)::geometry(Point, 4326)
WHEN cell_lon IS NOT NULL AND cell_lat IS NOT NULL THEN ST_SetSRID(ST_MakePoint(cell_lon, cell_lat), 4326)::geometry(Point, 4326)
ELSE NULL
END
) STORED,
cell_regionid varchar(64),
cell_x_offset_20 varchar(32),
cell_y_offset_20 varchar(32),
pci varchar(32),
indoor_flag smallint,
azimuth integer,
freq varchar(32),
freq_1 varchar(32),
vendor varchar(64),
antenna_height numeric(10, 2),
mechanical_downdip numeric(10, 2),
electron_downdip numeric(10, 2),
cover_type varchar(64),
rspower numeric(12, 4),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, cellkey, network_class)
);
COMMENT ON TABLE dmk.td_cell_param_m IS '月粒度工参维表,保留小区基础信息、经纬度和 WKT。';
COMMENT ON COLUMN dmk.td_cell_param_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.td_cell_param_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.td_cell_param_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.td_cell_param_m.network_class IS '网络制式4G/5G_SA/wifi 等)';
COMMENT ON COLUMN dmk.td_cell_param_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.td_cell_param_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.td_cell_param_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.td_cell_param_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.td_cell_param_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.td_cell_param_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.td_cell_param_m.cellkey IS '小区唯一键 cellkey';
COMMENT ON COLUMN dmk.td_cell_param_m.cell_name IS '小区名称';
COMMENT ON COLUMN dmk.td_cell_param_m.cell_lon IS '小区经度EPSG:4326';
COMMENT ON COLUMN dmk.td_cell_param_m.cell_lat IS '小区纬度EPSG:4326';
COMMENT ON COLUMN dmk.td_cell_param_m.cell_wkt IS '小区点 WKTEPSG:4326';
COMMENT ON COLUMN dmk.td_cell_param_m.cell_geom IS '由 cell_wkt 或经纬度生成的 Point 几何列,用于 GiST 空间索引';
COMMENT ON COLUMN dmk.td_cell_param_m.cell_regionid IS '小区所属栅格区域 ID';
COMMENT ON COLUMN dmk.td_cell_param_m.cell_x_offset_20 IS '小区所属栅格 X 偏移';
COMMENT ON COLUMN dmk.td_cell_param_m.cell_y_offset_20 IS '小区所属栅格 Y 偏移';
COMMENT ON COLUMN dmk.td_cell_param_m.pci IS '物理小区标识 PCI';
COMMENT ON COLUMN dmk.td_cell_param_m.indoor_flag IS '室内外标识0=室外 1=室内 -1=未知/全部';
COMMENT ON COLUMN dmk.td_cell_param_m.azimuth IS '天线方位角(度)';
COMMENT ON COLUMN dmk.td_cell_param_m.freq IS '频段标识';
COMMENT ON COLUMN dmk.td_cell_param_m.freq_1 IS '辅助频段标识';
COMMENT ON COLUMN dmk.td_cell_param_m.vendor IS '设备厂家';
COMMENT ON COLUMN dmk.td_cell_param_m.antenna_height IS '天线挂高(米)';
COMMENT ON COLUMN dmk.td_cell_param_m.mechanical_downdip IS '机械下倾角(度)';
COMMENT ON COLUMN dmk.td_cell_param_m.electron_downdip IS '电子下倾角(度)';
COMMENT ON COLUMN dmk.td_cell_param_m.cover_type IS '覆盖类型(如室分、宏站、微站等)';
COMMENT ON COLUMN dmk.td_cell_param_m.rspower IS '参考信号发射功率 RSPower';
COMMENT ON COLUMN dmk.td_cell_param_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_td_cell_param_region ON dmk.td_cell_param_m(year_month, provincecode, citycode, districtcode, operator_name, network_class);
CREATE INDEX IF NOT EXISTS idx_td_cell_param_geom ON dmk.td_cell_param_m USING gist(cell_geom) WHERE cell_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.td_building (
building_id varchar(64) PRIMARY KEY,
building_name varchar(128) NOT NULL,
building_type varchar(64),
building_type_name varchar(128),
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
center_lon numeric(10, 6),
center_lat numeric(10, 6),
bbox numeric(10, 6)[],
height numeric(12, 2),
floor_count integer,
building_area numeric(18, 4),
population_density numeric(14, 4),
aoi_wkt text,
aoi_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
CASE WHEN aoi_wkt IS NULL THEN NULL
ELSE ST_Multi(ST_GeomFromText(aoi_wkt, 4326))::geometry(MultiPolygon, 4326)
END
) STORED,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now()
);
COMMENT ON TABLE dmk.td_building IS '楼宇基础维表保留楼宇分类、人口密度、AOI WKT 和 bbox。';
COMMENT ON COLUMN dmk.td_building.building_id IS '楼宇唯一 ID';
COMMENT ON COLUMN dmk.td_building.building_name IS '楼宇名称';
COMMENT ON COLUMN dmk.td_building.building_type IS '楼宇类型编码';
COMMENT ON COLUMN dmk.td_building.building_type_name IS '楼宇类型名称';
COMMENT ON COLUMN dmk.td_building.provincecode IS '省编码';
COMMENT ON COLUMN dmk.td_building.province_name IS '省名称';
COMMENT ON COLUMN dmk.td_building.citycode IS '地市编码';
COMMENT ON COLUMN dmk.td_building.city_name IS '地市名称';
COMMENT ON COLUMN dmk.td_building.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.td_building.district_name IS '区县名称';
COMMENT ON COLUMN dmk.td_building.center_lon IS '楼宇中心点经度EPSG:4326';
COMMENT ON COLUMN dmk.td_building.center_lat IS '楼宇中心点纬度EPSG:4326';
COMMENT ON COLUMN dmk.td_building.bbox IS '楼宇外接矩形 [minLon,minLat,maxLon,maxLat]';
COMMENT ON COLUMN dmk.td_building.height IS '楼宇高度(米)';
COMMENT ON COLUMN dmk.td_building.floor_count IS '楼层数';
COMMENT ON COLUMN dmk.td_building.building_area IS '楼宇面积(平方米,按业务口径可表示建筑面积或占地面积)';
COMMENT ON COLUMN dmk.td_building.population_density IS '人口密度(人/平方公里或人/平方米,按业务口径)';
COMMENT ON COLUMN dmk.td_building.aoi_wkt IS '楼宇 AOI WKTEPSG:4326';
COMMENT ON COLUMN dmk.td_building.aoi_geom IS '由 aoi_wkt 生成的 MultiPolygon 几何列,用于 GiST 空间索引';
COMMENT ON COLUMN dmk.td_building.is_valid IS '是否有效1=有效 0=无效';
COMMENT ON COLUMN dmk.td_building.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_td_building_query ON dmk.td_building(provincecode, citycode, districtcode, building_type, is_valid);
CREATE INDEX IF NOT EXISTS idx_td_building_geom ON dmk.td_building USING gist(aoi_geom) WHERE aoi_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.td_scene (
scene_id varchar(64) PRIMARY KEY,
scene_name varchar(128) NOT NULL,
scene_type varchar(64) NOT NULL,
scene_type_name varchar(128),
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
center_lon numeric(10, 6),
center_lat numeric(10, 6),
bbox numeric(10, 6)[],
area_size numeric(18, 4),
aoi_wkt text,
aoi_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
CASE WHEN aoi_wkt IS NULL THEN NULL
ELSE ST_Multi(ST_GeomFromText(aoi_wkt, 4326))::geometry(MultiPolygon, 4326)
END
) STORED,
is_valid smallint NOT NULL DEFAULT 1,
updated_time timestamp without time zone NOT NULL DEFAULT now()
);
COMMENT ON TABLE dmk.td_scene IS '重点场景维表保留场景类型、AOI WKT、中心点和 bbox。';
COMMENT ON COLUMN dmk.td_scene.scene_id IS '场景唯一 ID';
COMMENT ON COLUMN dmk.td_scene.scene_name IS '场景名称';
COMMENT ON COLUMN dmk.td_scene.scene_type IS '场景类型编码';
COMMENT ON COLUMN dmk.td_scene.scene_type_name IS '场景类型名称';
COMMENT ON COLUMN dmk.td_scene.provincecode IS '省编码';
COMMENT ON COLUMN dmk.td_scene.province_name IS '省名称';
COMMENT ON COLUMN dmk.td_scene.citycode IS '地市编码';
COMMENT ON COLUMN dmk.td_scene.city_name IS '地市名称';
COMMENT ON COLUMN dmk.td_scene.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.td_scene.district_name IS '区县名称';
COMMENT ON COLUMN dmk.td_scene.center_lon IS '场景中心点经度EPSG:4326';
COMMENT ON COLUMN dmk.td_scene.center_lat IS '场景中心点纬度EPSG:4326';
COMMENT ON COLUMN dmk.td_scene.bbox IS '场景外接矩形 [minLon,minLat,maxLon,maxLat]';
COMMENT ON COLUMN dmk.td_scene.area_size IS '场景面积(平方米)';
COMMENT ON COLUMN dmk.td_scene.aoi_wkt IS '场景 AOI WKTEPSG:4326';
COMMENT ON COLUMN dmk.td_scene.aoi_geom IS '由 aoi_wkt 生成的 MultiPolygon 几何列,用于 GiST 空间索引';
COMMENT ON COLUMN dmk.td_scene.is_valid IS '是否有效1=有效 0=无效';
COMMENT ON COLUMN dmk.td_scene.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_td_scene_search ON dmk.td_scene(provincecode, citycode, scene_type, scene_name, is_valid);
CREATE INDEX IF NOT EXISTS idx_td_scene_geom ON dmk.td_scene USING gist(aoi_geom) WHERE aoi_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.td_cluster_threshold (
account_id varchar(64) NOT NULL,
cluster_type varchar(64) NOT NULL,
network_class varchar(32) NOT NULL,
min_grid_count integer NOT NULL DEFAULT 5,
max_area_size numeric(18, 4),
min_weighted_score numeric(10, 4),
max_region_distance numeric(18, 4),
rsrp_threshold numeric(10, 4),
coverage_threshold numeric(10, 4),
threshold_config jsonb,
updated_by varchar(64),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (account_id, cluster_type, network_class)
);
COMMENT ON TABLE dmk.td_cluster_threshold IS '聚类阈值配置表,支撑在线调整区域栅格数和区域范围阈值。';
COMMENT ON COLUMN dmk.td_cluster_threshold.account_id IS '账号 ID按用户维度持久化阈值';
COMMENT ON COLUMN dmk.td_cluster_threshold.cluster_type IS '聚类类型(如弱覆盖、超忙、综合质差等)';
COMMENT ON COLUMN dmk.td_cluster_threshold.network_class IS '网络制式';
COMMENT ON COLUMN dmk.td_cluster_threshold.min_grid_count IS '区域最少栅格数阈值';
COMMENT ON COLUMN dmk.td_cluster_threshold.max_area_size IS '区域最大面积阈值(平方米)';
COMMENT ON COLUMN dmk.td_cluster_threshold.min_weighted_score IS '加权得分下限阈值';
COMMENT ON COLUMN dmk.td_cluster_threshold.max_region_distance IS '区域最大跨度距离阈值(米)';
COMMENT ON COLUMN dmk.td_cluster_threshold.rsrp_threshold IS 'RSRP 阈值dBm';
COMMENT ON COLUMN dmk.td_cluster_threshold.coverage_threshold IS '覆盖率阈值0-1';
COMMENT ON COLUMN dmk.td_cluster_threshold.threshold_config IS '其他阈值参数 JSON';
COMMENT ON COLUMN dmk.td_cluster_threshold.updated_by IS '最后更新人账号';
COMMENT ON COLUMN dmk.td_cluster_threshold.updated_time IS '记录更新时间';
CREATE TABLE IF NOT EXISTS dmk.td_custom_region (
region_id varchar(64) PRIMARY KEY,
account_id varchar(64) NOT NULL,
provincecode integer,
citycode integer,
districtcode integer,
region_wkt text NOT NULL,
region_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
ST_Multi(ST_GeomFromText(region_wkt, 4326))::geometry(MultiPolygon, 4326)
) STORED,
bbox numeric(10, 6)[],
created_time timestamp without time zone NOT NULL DEFAULT now(),
expire_time timestamp without time zone,
is_deleted smallint NOT NULL DEFAULT 0
);
COMMENT ON TABLE dmk.td_custom_region IS '用户自定义区域表region_wkt 固定 EPSG:4326。';
COMMENT ON COLUMN dmk.td_custom_region.region_id IS '自定义区域 ID';
COMMENT ON COLUMN dmk.td_custom_region.account_id IS '账号 ID区域归属用户';
COMMENT ON COLUMN dmk.td_custom_region.provincecode IS '省编码';
COMMENT ON COLUMN dmk.td_custom_region.citycode IS '地市编码';
COMMENT ON COLUMN dmk.td_custom_region.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.td_custom_region.region_wkt IS '自定义区域 WKTEPSG:4326';
COMMENT ON COLUMN dmk.td_custom_region.region_geom IS '由 region_wkt 生成的 MultiPolygon 几何列';
COMMENT ON COLUMN dmk.td_custom_region.bbox IS '区域外接矩形';
COMMENT ON COLUMN dmk.td_custom_region.created_time IS '区域创建时间';
COMMENT ON COLUMN dmk.td_custom_region.expire_time IS '过期时间(用于临时区域清理)';
COMMENT ON COLUMN dmk.td_custom_region.is_deleted IS '是否已删除0=未删除 1=已删除';
CREATE INDEX IF NOT EXISTS idx_td_custom_region_query ON dmk.td_custom_region(account_id, provincecode, citycode, created_time DESC, is_deleted);
CREATE INDEX IF NOT EXISTS idx_td_custom_region_geom ON dmk.td_custom_region USING gist(region_geom);
-- =========================================================
-- 3. 区域栅格与地市报表指标表
-- =========================================================
CREATE TABLE IF NOT EXISTS dmk.tm_grid_coverage_m (
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
data_type integer NOT NULL,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
operator_name varchar(32) NOT NULL,
network_class varchar(32) NOT NULL,
freq varchar(32) NOT NULL DEFAULT 'all',
indoor_flag smallint NOT NULL DEFAULT -1,
regionid varchar(64) NOT NULL,
x_offset_20 varchar(32) NOT NULL,
y_offset_20 varchar(32) NOT NULL,
center_lon numeric(10, 6),
center_lat numeric(10, 6),
grid_wkt text,
grid_geom geometry(Polygon, 4326) GENERATED ALWAYS AS (
CASE WHEN grid_wkt IS NULL THEN NULL
ELSE ST_GeomFromText(grid_wkt, 4326)::geometry(Polygon, 4326)
END
) STORED,
earfcn integer,
rsrpcount bigint NOT NULL DEFAULT 0,
totalrsrp numeric(20, 4),
totalsinr numeric(20, 4),
totalrsrq numeric(20, 4),
avgrsrp numeric(10, 4),
avgsinr numeric(10, 4),
avgrsrq numeric(10, 4),
rsrpgoodcount_105 bigint NOT NULL DEFAULT 0,
rsrpgoodcount_110 bigint NOT NULL DEFAULT 0,
sinrgoodcount bigint NOT NULL DEFAULT 0,
rsrqgoodcount bigint NOT NULL DEFAULT 0,
rsrp_good_ratio_105 numeric(12, 6),
rsrp_good_ratio_110 numeric(12, 6),
mr_cover_rate_105 numeric(12, 6),
mr_cover_rate_110 numeric(12, 6),
is_covered_105 smallint NOT NULL DEFAULT 0,
is_covered_110 smallint NOT NULL DEFAULT 0,
weakcover_mrcount bigint NOT NULL DEFAULT 0,
overlap_mrcount bigint NOT NULL DEFAULT 0,
overshoot_mrcount bigint NOT NULL DEFAULT 0,
use_heat_5g numeric(12, 6),
total_user_count bigint,
user_count_4g bigint,
user_count_5g bigint,
user_market_share_4g numeric(12, 6),
user_market_share_5g numeric(12, 6),
operator_5g_reside_rate numeric(12, 6),
top1_cellkey varchar(64),
top1_cell_name varchar(128),
top1_cell_lon numeric(10, 6),
top1_cell_lat numeric(10, 6),
top1_cell_rsrpcount bigint,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, data_type, regionid, x_offset_20, y_offset_20, operator_name, network_class, freq, indoor_flag)
);
COMMENT ON TABLE dmk.tm_grid_coverage_m IS '栅格级覆盖指标月表,支撑 GIS 栅格图层、单栅格详情和底层聚合。';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.year IS '账期年份';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.month IS '账期月份';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.network_class IS '网络制式4G/5G_SA/all';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.freq IS '频段all 表示全部频段聚合';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.indoor_flag IS '室内外标识0=室外 1=室内 -1=全部';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.regionid IS '栅格区域 ID';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.x_offset_20 IS '栅格 X 偏移';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.y_offset_20 IS '栅格 Y 偏移';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.center_lon IS '栅格中心点经度';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.center_lat IS '栅格中心点纬度';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.grid_wkt IS '栅格 WKTEPSG:4326';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.grid_geom IS '由 grid_wkt 生成的 Polygon 几何列,用于 GiST 索引/WMS 发布';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.earfcn IS '主用频点号 EARFCN';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.rsrpcount IS 'MR 采样点总数RSRP 采样数)';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.totalrsrp IS 'RSRP 累加值(用于聚合时再求平均)';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.totalsinr IS 'SINR 累加值';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.totalrsrq IS 'RSRQ 累加值';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.avgrsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.avgsinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.avgrsrq IS '平均 RSRQdB';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.rsrpgoodcount_105 IS 'RSRP≥-105 的采样数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.rsrpgoodcount_110 IS 'RSRP≥-110 的采样数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.sinrgoodcount IS 'SINR 达标采样数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.rsrqgoodcount IS 'RSRQ 达标采样数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.rsrp_good_ratio_105 IS 'RSRP≥-105 采样占比';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.rsrp_good_ratio_110 IS 'RSRP≥-110 采样占比';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.mr_cover_rate_105 IS 'MR 覆盖率(-105)rsrpgoodcount_105/rsrpcount';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.mr_cover_rate_110 IS 'MR 覆盖率(-110)rsrpgoodcount_110/rsrpcount';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.is_covered_105 IS '该栅格是否达 -105 覆盖1=达标 0=未达标';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.is_covered_110 IS '该栅格是否达 -110 覆盖1=达标 0=未达标';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.weakcover_mrcount IS '弱覆盖采样数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.overlap_mrcount IS '重叠覆盖采样数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.overshoot_mrcount IS '过覆盖采样数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.use_heat_5g IS '5G 使用热度';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.total_user_count IS '栅格内总用户数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.user_count_4g IS '4G 用户数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.user_count_5g IS '5G 用户数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.user_market_share_4g IS '4G 用户市场份额';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.user_market_share_5g IS '5G 用户市场份额';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.operator_5g_reside_rate IS '运营商 5G 驻留比';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.top1_cellkey IS 'TOP1 主服务小区 cellkey';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.top1_cell_name IS 'TOP1 主服务小区名称';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.top1_cell_lon IS 'TOP1 小区经度';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.top1_cell_lat IS 'TOP1 小区纬度';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.top1_cell_rsrpcount IS 'TOP1 小区在该栅格的采样数';
COMMENT ON COLUMN dmk.tm_grid_coverage_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_grid_cov_filter ON dmk.tm_grid_coverage_m(year_month, data_type, provincecode, citycode, districtcode, operator_name, network_class, freq, indoor_flag);
CREATE INDEX IF NOT EXISTS idx_tm_grid_cov_regionid ON dmk.tm_grid_coverage_m(year_month, regionid, x_offset_20, y_offset_20);
CREATE INDEX IF NOT EXISTS idx_tm_grid_cov_geom ON dmk.tm_grid_coverage_m USING gist(grid_geom) WHERE grid_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.tm_region_coverage_m (
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
data_type integer NOT NULL,
region_level varchar(16) NOT NULL,
region_code integer NOT NULL,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
operator_name varchar(32) NOT NULL,
network_class varchar(32) NOT NULL,
freq varchar(32) NOT NULL DEFAULT 'all',
indoor_flag smallint NOT NULL DEFAULT -1,
rsrpcount bigint NOT NULL DEFAULT 0,
rsrpgoodcount_105 bigint NOT NULL DEFAULT 0,
rsrpgoodcount_110 bigint NOT NULL DEFAULT 0,
grid_count bigint NOT NULL DEFAULT 0,
mr_grid_count bigint NOT NULL DEFAULT 0,
covered_grid_count_105 bigint NOT NULL DEFAULT 0,
covered_grid_count_110 bigint NOT NULL DEFAULT 0,
mr_cover_rate_105 numeric(12, 6),
mr_cover_rate_110 numeric(12, 6),
grid_cover_rate_105 numeric(12, 6),
grid_cover_rate_110 numeric(12, 6),
avgrsrp numeric(10, 4),
avgsinr numeric(10, 4),
total_user_count bigint,
user_count_4g bigint,
user_count_5g bigint,
user_ratio_4g numeric(12, 6),
user_ratio_5g numeric(12, 6),
total_user_market_share numeric(12, 6),
user_market_share_4g numeric(12, 6),
user_market_share_5g numeric(12, 6),
operator_5g_reside_rate numeric(12, 6),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, data_type, region_level, region_code, operator_name, network_class, freq, indoor_flag)
);
COMMENT ON TABLE dmk.tm_region_coverage_m IS '行政区域覆盖聚合月表,支撑区域概览、覆盖统计和 OTT 地市报表。';
COMMENT ON COLUMN dmk.tm_region_coverage_m.grid_count IS '区域内总栅格数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.mr_grid_count IS '区域内有 MR 采样点rsrpcount>0的栅格数作为栅格覆盖率的分母';
COMMENT ON COLUMN dmk.tm_region_coverage_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_region_coverage_m.year IS '账期年份';
COMMENT ON COLUMN dmk.tm_region_coverage_m.month IS '账期月份';
COMMENT ON COLUMN dmk.tm_region_coverage_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.tm_region_coverage_m.region_level IS '区域级别nation/province/city/district';
COMMENT ON COLUMN dmk.tm_region_coverage_m.region_code IS '区域编码';
COMMENT ON COLUMN dmk.tm_region_coverage_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_region_coverage_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_region_coverage_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_region_coverage_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_region_coverage_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_region_coverage_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_region_coverage_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.tm_region_coverage_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.tm_region_coverage_m.freq IS '频段';
COMMENT ON COLUMN dmk.tm_region_coverage_m.indoor_flag IS '室内外标识';
COMMENT ON COLUMN dmk.tm_region_coverage_m.rsrpcount IS '区域内 MR 采样点总数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.rsrpgoodcount_105 IS 'RSRP≥-105 的采样数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.rsrpgoodcount_110 IS 'RSRP≥-110 的采样数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.covered_grid_count_105 IS '达到 -105 覆盖阈值的栅格数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.covered_grid_count_110 IS '达到 -110 覆盖阈值的栅格数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.mr_cover_rate_105 IS 'MR 覆盖率(-105)';
COMMENT ON COLUMN dmk.tm_region_coverage_m.mr_cover_rate_110 IS 'MR 覆盖率(-110)';
COMMENT ON COLUMN dmk.tm_region_coverage_m.grid_cover_rate_105 IS '栅格覆盖率(-105)covered_grid_count_105/mr_grid_count';
COMMENT ON COLUMN dmk.tm_region_coverage_m.grid_cover_rate_110 IS '栅格覆盖率(-110)covered_grid_count_110/mr_grid_count';
COMMENT ON COLUMN dmk.tm_region_coverage_m.avgrsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_region_coverage_m.avgsinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_region_coverage_m.total_user_count IS '区域内总用户数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.user_count_4g IS '4G 用户数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.user_count_5g IS '5G 用户数';
COMMENT ON COLUMN dmk.tm_region_coverage_m.user_ratio_4g IS '4G 用户占比';
COMMENT ON COLUMN dmk.tm_region_coverage_m.user_ratio_5g IS '5G 用户占比';
COMMENT ON COLUMN dmk.tm_region_coverage_m.total_user_market_share IS '总用户市场份额';
COMMENT ON COLUMN dmk.tm_region_coverage_m.user_market_share_4g IS '4G 用户市场份额';
COMMENT ON COLUMN dmk.tm_region_coverage_m.user_market_share_5g IS '5G 用户市场份额';
COMMENT ON COLUMN dmk.tm_region_coverage_m.operator_5g_reside_rate IS '运营商 5G 驻留比';
COMMENT ON COLUMN dmk.tm_region_coverage_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_region_cov_filter ON dmk.tm_region_coverage_m(year_month, data_type, provincecode, citycode, districtcode, operator_name, network_class);
CREATE INDEX IF NOT EXISTS idx_tm_region_cov_report ON dmk.tm_region_coverage_m(year_month, region_level, region_code, operator_name, network_class, grid_cover_rate_105 DESC);
-- =========================================================
-- 4. 楼宇与重点场景指标表
-- =========================================================
CREATE TABLE IF NOT EXISTS dmk.tm_building_coverage_m (
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
data_type integer NOT NULL,
building_id varchar(64) NOT NULL,
building_name varchar(128) NOT NULL,
building_type varchar(64),
building_type_name varchar(128),
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
center_lon numeric(10, 6),
center_lat numeric(10, 6),
bbox numeric(10, 6)[],
building_area numeric(18, 4),
population_density numeric(14, 4),
aoi_wkt text,
aoi_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
CASE WHEN aoi_wkt IS NULL THEN NULL
ELSE ST_Multi(ST_GeomFromText(aoi_wkt, 4326))::geometry(MultiPolygon, 4326)
END
) STORED,
operator_name varchar(32) NOT NULL,
network_class varchar(32) NOT NULL,
freq varchar(32) NOT NULL DEFAULT 'all',
indoor_flag smallint NOT NULL DEFAULT -1,
rsrpcount bigint NOT NULL DEFAULT 0,
rsrpgoodcount_105 bigint NOT NULL DEFAULT 0,
rsrpgoodcount_110 bigint NOT NULL DEFAULT 0,
grid_count bigint NOT NULL DEFAULT 0,
mr_grid_count bigint NOT NULL DEFAULT 0,
covered_grid_count_105 bigint NOT NULL DEFAULT 0,
covered_grid_count_110 bigint NOT NULL DEFAULT 0,
mr_cover_rate_105 numeric(12, 6),
mr_cover_rate_110 numeric(12, 6),
grid_cover_rate_105 numeric(12, 6),
grid_cover_rate_110 numeric(12, 6),
building_cover_rate numeric(12, 6),
wireless_cover_rate numeric(12, 6),
indoor_cover_rate numeric(12, 6),
avgrsrp numeric(10, 4),
avgsinr numeric(10, 4),
avgrsrq numeric(10, 4),
weakcover_mrcount bigint NOT NULL DEFAULT 0,
overlap_mrcount bigint NOT NULL DEFAULT 0,
overlap_total_value numeric(20, 4),
overlap_rate numeric(12, 6),
overlap_avgrsrp numeric(10, 4),
overshoot_mrcount bigint NOT NULL DEFAULT 0,
overshoot_total_value numeric(20, 4),
overshoot_rate numeric(12, 6),
overshoot_avgrsrp numeric(10, 4),
mod_interference_mrcount bigint NOT NULL DEFAULT 0,
mod_interference_total_value numeric(20, 4),
mod_interference_avgrsrp numeric(10, 4),
mod_interference_ratio numeric(12, 6),
use_heat_5g numeric(12, 6),
total_user_count bigint,
user_count_4g bigint,
user_count_5g bigint,
user_market_share_4g numeric(12, 6),
user_market_share_5g numeric(12, 6),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, data_type, building_id, operator_name, network_class, freq, indoor_flag)
);
COMMENT ON TABLE dmk.tm_building_coverage_m IS '楼宇覆盖指标月表,回填楼宇维度字段,支撑楼宇图层、对比和报表。';
COMMENT ON COLUMN dmk.tm_building_coverage_m.grid_count IS '楼宇覆盖范围内总栅格数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.mr_grid_count IS '楼宇覆盖范围内有 MR 采样点的栅格数,作为楼宇栅格覆盖率的分母';
COMMENT ON COLUMN dmk.tm_building_coverage_m.total_user_count IS '楼宇内总用户数OTT 楼宇报表 total_user_count 字段直读';
COMMENT ON COLUMN dmk.tm_building_coverage_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_building_coverage_m.year IS '账期年份';
COMMENT ON COLUMN dmk.tm_building_coverage_m.month IS '账期月份';
COMMENT ON COLUMN dmk.tm_building_coverage_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.tm_building_coverage_m.building_id IS '楼宇 ID';
COMMENT ON COLUMN dmk.tm_building_coverage_m.building_name IS '楼宇名称';
COMMENT ON COLUMN dmk.tm_building_coverage_m.building_type IS '楼宇类型编码';
COMMENT ON COLUMN dmk.tm_building_coverage_m.building_type_name IS '楼宇类型名称';
COMMENT ON COLUMN dmk.tm_building_coverage_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_building_coverage_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_building_coverage_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_building_coverage_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_building_coverage_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_building_coverage_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_building_coverage_m.center_lon IS '楼宇中心点经度';
COMMENT ON COLUMN dmk.tm_building_coverage_m.center_lat IS '楼宇中心点纬度';
COMMENT ON COLUMN dmk.tm_building_coverage_m.bbox IS '楼宇外接矩形';
COMMENT ON COLUMN dmk.tm_building_coverage_m.building_area IS '楼宇面积(平方米,冗余自楼宇基础维表)';
COMMENT ON COLUMN dmk.tm_building_coverage_m.population_density IS '人口密度';
COMMENT ON COLUMN dmk.tm_building_coverage_m.aoi_wkt IS '楼宇 AOI WKTEPSG:4326';
COMMENT ON COLUMN dmk.tm_building_coverage_m.aoi_geom IS '由 aoi_wkt 生成的 MultiPolygon 几何列';
COMMENT ON COLUMN dmk.tm_building_coverage_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.tm_building_coverage_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.tm_building_coverage_m.freq IS '频段';
COMMENT ON COLUMN dmk.tm_building_coverage_m.indoor_flag IS '室内外标识';
COMMENT ON COLUMN dmk.tm_building_coverage_m.rsrpcount IS '楼宇覆盖范围内 MR 采样数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.rsrpgoodcount_105 IS 'RSRP≥-105 的采样数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.rsrpgoodcount_110 IS 'RSRP≥-110 的采样数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.covered_grid_count_105 IS '达到 -105 覆盖阈值的栅格数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.covered_grid_count_110 IS '达到 -110 覆盖阈值的栅格数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.mr_cover_rate_105 IS 'MR 覆盖率(-105)';
COMMENT ON COLUMN dmk.tm_building_coverage_m.mr_cover_rate_110 IS 'MR 覆盖率(-110)';
COMMENT ON COLUMN dmk.tm_building_coverage_m.grid_cover_rate_105 IS '栅格覆盖率(-105)';
COMMENT ON COLUMN dmk.tm_building_coverage_m.grid_cover_rate_110 IS '栅格覆盖率(-110)';
COMMENT ON COLUMN dmk.tm_building_coverage_m.building_cover_rate IS '楼宇覆盖率';
COMMENT ON COLUMN dmk.tm_building_coverage_m.wireless_cover_rate IS '无线覆盖率';
COMMENT ON COLUMN dmk.tm_building_coverage_m.indoor_cover_rate IS '室内覆盖率';
COMMENT ON COLUMN dmk.tm_building_coverage_m.avgrsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_building_coverage_m.avgsinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_building_coverage_m.avgrsrq IS '平均 RSRQdB支撑楼宇竞对无线网络覆盖';
COMMENT ON COLUMN dmk.tm_building_coverage_m.weakcover_mrcount IS '弱覆盖采样数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.overlap_mrcount IS '重叠覆盖采样数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.overlap_total_value IS '重叠覆盖总值';
COMMENT ON COLUMN dmk.tm_building_coverage_m.overlap_rate IS '重叠覆盖率';
COMMENT ON COLUMN dmk.tm_building_coverage_m.overlap_avgrsrp IS '重叠覆盖平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_building_coverage_m.overshoot_mrcount IS '过覆盖采样数';
COMMENT ON COLUMN dmk.tm_building_coverage_m.overshoot_total_value IS '过覆盖总值';
COMMENT ON COLUMN dmk.tm_building_coverage_m.overshoot_rate IS '过覆盖率';
COMMENT ON COLUMN dmk.tm_building_coverage_m.overshoot_avgrsrp IS '过覆盖平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_building_coverage_m.mod_interference_mrcount IS 'MOD 干扰采样数4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_building_coverage_m.mod_interference_total_value IS 'MOD 干扰采样点总值4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_building_coverage_m.mod_interference_avgrsrp IS 'MOD 干扰平均 RSRPdBm4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_building_coverage_m.mod_interference_ratio IS 'MOD 干扰占比4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_building_coverage_m.use_heat_5g IS '5G 使用热度';
COMMENT ON COLUMN dmk.tm_building_coverage_m.user_count_4g IS '楼宇 4G 用户数,用于替换原无线市场份额指标';
COMMENT ON COLUMN dmk.tm_building_coverage_m.user_count_5g IS '楼宇 5G 用户数,用于替换原无线市场份额指标';
COMMENT ON COLUMN dmk.tm_building_coverage_m.user_market_share_4g IS '楼宇 4G 用户市场份额';
COMMENT ON COLUMN dmk.tm_building_coverage_m.user_market_share_5g IS '楼宇 5G 用户市场份额';
COMMENT ON COLUMN dmk.tm_building_coverage_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_building_cov_filter ON dmk.tm_building_coverage_m(year_month, data_type, provincecode, citycode, districtcode, building_type, operator_name, network_class);
CREATE INDEX IF NOT EXISTS idx_tm_building_cov_report ON dmk.tm_building_coverage_m(year_month, citycode, building_type, grid_cover_rate_110 DESC);
CREATE INDEX IF NOT EXISTS idx_tm_building_cov_geom ON dmk.tm_building_coverage_m USING gist(aoi_geom) WHERE aoi_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.tm_building_user_wifi_m (
year_month varchar(7) NOT NULL,
building_id varchar(64) NOT NULL,
building_name varchar(128),
building_type varchar(64),
provincecode integer,
citycode integer,
districtcode integer,
operator_name varchar(32) NOT NULL,
wifi_total_user_count bigint,
wifi_user_count bigint,
wifi_market_share numeric(12, 6),
wifi_signal_strength numeric(10, 4),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, building_id, operator_name)
);
COMMENT ON TABLE dmk.tm_building_user_wifi_m IS '楼宇 WiFi 指标月表,楼宇 4G/5G_SA 用户数和市场份额落在 tm_building_coverage_m。';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.building_id IS '楼宇 ID';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.building_name IS '楼宇名称';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.building_type IS '楼宇类型编码';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.wifi_total_user_count IS '楼宇内 WiFi 总用户数';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.wifi_user_count IS '本运营商 WiFi 用户数';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.wifi_market_share IS '本运营商 WiFi 市场份额';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.wifi_signal_strength IS 'WiFi 平均信号强度dBm';
COMMENT ON COLUMN dmk.tm_building_user_wifi_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_building_user_wifi_query ON dmk.tm_building_user_wifi_m(year_month, provincecode, citycode, districtcode, building_type);
CREATE TABLE IF NOT EXISTS dmk.tm_scene_coverage_m (
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
data_type integer NOT NULL,
scene_id varchar(64) NOT NULL,
scene_name varchar(128) NOT NULL,
scene_type varchar(64) NOT NULL,
scene_type_name varchar(128),
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
center_lon numeric(10, 6),
center_lat numeric(10, 6),
bbox numeric(10, 6)[],
aoi_wkt text,
aoi_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
CASE WHEN aoi_wkt IS NULL THEN NULL
ELSE ST_Multi(ST_GeomFromText(aoi_wkt, 4326))::geometry(MultiPolygon, 4326)
END
) STORED,
operator_name varchar(32) NOT NULL,
network_class varchar(32) NOT NULL,
freq varchar(32) NOT NULL DEFAULT 'all',
indoor_flag smallint NOT NULL DEFAULT -1,
rsrpcount bigint NOT NULL DEFAULT 0,
rsrpgoodcount_105 bigint NOT NULL DEFAULT 0,
rsrpgoodcount_110 bigint NOT NULL DEFAULT 0,
grid_count bigint NOT NULL DEFAULT 0,
mr_grid_count bigint NOT NULL DEFAULT 0,
covered_grid_count_105 bigint NOT NULL DEFAULT 0,
covered_grid_count_110 bigint NOT NULL DEFAULT 0,
mr_cover_rate_105 numeric(12, 6),
mr_cover_rate_110 numeric(12, 6),
grid_cover_rate_105 numeric(12, 6),
grid_cover_rate_110 numeric(12, 6),
avgrsrp numeric(10, 4),
avgsinr numeric(10, 4),
weakcover_mrcount bigint NOT NULL DEFAULT 0,
overlap_mrcount bigint NOT NULL DEFAULT 0,
overlap_total_value numeric(20, 4),
overlap_rate numeric(12, 6),
overlap_avgrsrp numeric(10, 4),
overshoot_mrcount bigint NOT NULL DEFAULT 0,
overshoot_total_value numeric(20, 4),
overshoot_rate numeric(12, 6),
overshoot_avgrsrp numeric(10, 4),
mod_interference_mrcount bigint NOT NULL DEFAULT 0,
mod_interference_total_value numeric(20, 4),
mod_interference_avgrsrp numeric(10, 4),
mod_interference_ratio numeric(12, 6),
total_user_count bigint,
user_count_4g bigint,
user_count_5g bigint,
user_ratio_4g numeric(12, 6),
user_ratio_5g numeric(12, 6),
total_user_market_share numeric(12, 6),
user_market_share_4g numeric(12, 6),
user_market_share_5g numeric(12, 6),
operator_5g_reside_rate numeric(12, 6),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, data_type, scene_id, operator_name, network_class, freq, indoor_flag)
);
COMMENT ON TABLE dmk.tm_scene_coverage_m IS '重点场景覆盖指标月表,回填场景维度字段,支撑场景概览、用户分析、对比和报表。';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.grid_count IS '场景覆盖范围内总栅格数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.mr_grid_count IS '场景覆盖范围内有 MR 采样点的栅格数,作为场景栅格覆盖率的分母';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.year IS '账期年份';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.month IS '账期月份';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.scene_id IS '场景 ID';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.scene_name IS '场景名称';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.scene_type IS '场景类型编码';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.scene_type_name IS '场景类型名称';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.center_lon IS '场景中心点经度';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.center_lat IS '场景中心点纬度';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.bbox IS '场景外接矩形';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.aoi_wkt IS '场景 AOI WKT';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.aoi_geom IS '由 aoi_wkt 生成的 MultiPolygon 几何列';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.freq IS '频段';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.indoor_flag IS '室内外标识';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.rsrpcount IS '场景覆盖范围内 MR 采样数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.rsrpgoodcount_105 IS 'RSRP≥-105 的采样数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.rsrpgoodcount_110 IS 'RSRP≥-110 的采样数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.covered_grid_count_105 IS '达到 -105 覆盖阈值的栅格数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.covered_grid_count_110 IS '达到 -110 覆盖阈值的栅格数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.mr_cover_rate_105 IS 'MR 覆盖率(-105)';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.mr_cover_rate_110 IS 'MR 覆盖率(-110)';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.grid_cover_rate_105 IS '栅格覆盖率(-105)';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.grid_cover_rate_110 IS '栅格覆盖率(-110)';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.avgrsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.avgsinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.weakcover_mrcount IS '弱覆盖采样数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.overlap_mrcount IS '重叠覆盖采样数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.overlap_total_value IS '重叠覆盖总值';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.overlap_rate IS '重叠覆盖率';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.overlap_avgrsrp IS '重叠覆盖平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.overshoot_mrcount IS '过覆盖采样数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.overshoot_total_value IS '过覆盖总值';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.overshoot_rate IS '过覆盖率';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.overshoot_avgrsrp IS '过覆盖平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.mod_interference_mrcount IS 'MOD 干扰采样数4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.mod_interference_total_value IS 'MOD 干扰采样点总值4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.mod_interference_avgrsrp IS 'MOD 干扰平均 RSRPdBm4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.mod_interference_ratio IS 'MOD 干扰占比4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.total_user_count IS '场景内总用户数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.user_count_4g IS '4G 用户数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.user_count_5g IS '5G 用户数';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.user_ratio_4g IS '4G 用户占比';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.user_ratio_5g IS '5G 用户占比';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.total_user_market_share IS '总用户市场份额';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.user_market_share_4g IS '4G 用户市场份额';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.user_market_share_5g IS '5G 用户市场份额';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.operator_5g_reside_rate IS '运营商 5G 驻留比';
COMMENT ON COLUMN dmk.tm_scene_coverage_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_scene_cov_filter ON dmk.tm_scene_coverage_m(year_month, data_type, provincecode, citycode, scene_type, scene_name, operator_name, network_class);
CREATE INDEX IF NOT EXISTS idx_tm_scene_cov_geom ON dmk.tm_scene_coverage_m USING gist(aoi_geom) WHERE aoi_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.tm_scene_grid_coverage_m (
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
data_type integer NOT NULL,
scene_id varchar(64) NOT NULL,
scene_name varchar(128) NOT NULL,
scene_type varchar(64) NOT NULL,
scene_type_name varchar(128),
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
operator_name varchar(32) NOT NULL,
network_class varchar(32) NOT NULL,
freq varchar(32) NOT NULL DEFAULT 'all',
indoor_flag smallint NOT NULL DEFAULT -1,
regionid varchar(64) NOT NULL,
x_offset_20 varchar(32) NOT NULL,
y_offset_20 varchar(32) NOT NULL,
grid_wkt text,
grid_geom geometry(Polygon, 4326) GENERATED ALWAYS AS (
CASE WHEN grid_wkt IS NULL THEN NULL
ELSE ST_GeomFromText(grid_wkt, 4326)::geometry(Polygon, 4326)
END
) STORED,
rsrpcount bigint NOT NULL DEFAULT 0,
avgrsrp numeric(10, 4),
avgsinr numeric(10, 4),
mr_cover_rate_105 numeric(12, 6),
mr_cover_rate_110 numeric(12, 6),
grid_cover_rate_105 numeric(12, 6),
grid_cover_rate_110 numeric(12, 6),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, data_type, scene_id, regionid, x_offset_20, y_offset_20, operator_name, network_class, freq, indoor_flag)
);
COMMENT ON TABLE dmk.tm_scene_grid_coverage_m IS '重点场景栅格桥接月表,支撑 /api/scenes/layer 与场景栅格发布。';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.year IS '账期年份';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.month IS '账期月份';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.scene_id IS '场景 ID';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.scene_name IS '场景名称';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.scene_type IS '场景类型编码';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.scene_type_name IS '场景类型名称';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.freq IS '频段';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.indoor_flag IS '室内外标识';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.regionid IS '栅格区域 ID';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.x_offset_20 IS '栅格 X 偏移';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.y_offset_20 IS '栅格 Y 偏移';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.grid_wkt IS '栅格 WKTEPSG:4326';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.grid_geom IS '由 grid_wkt 生成的 Polygon 几何列';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.rsrpcount IS '栅格 MR 采样数';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.avgrsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.avgsinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.mr_cover_rate_105 IS 'MR 覆盖率(-105)';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.mr_cover_rate_110 IS 'MR 覆盖率(-110)';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.grid_cover_rate_105 IS '栅格覆盖率(-105)';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.grid_cover_rate_110 IS '栅格覆盖率(-110)';
COMMENT ON COLUMN dmk.tm_scene_grid_coverage_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_scene_grid_cov_filter ON dmk.tm_scene_grid_coverage_m(year_month, data_type, provincecode, citycode, scene_type, scene_name, operator_name, network_class);
CREATE INDEX IF NOT EXISTS idx_tm_scene_grid_cov_geom ON dmk.tm_scene_grid_coverage_m USING gist(grid_geom) WHERE grid_geom IS NOT NULL;
-- =========================================================
-- 5. 工参与小区覆盖指标表
-- =========================================================
CREATE TABLE IF NOT EXISTS dmk.td_building_grid_m (
year_month varchar(7) NOT NULL,
data_type integer NOT NULL,
building_id varchar(64) NOT NULL,
regionid varchar(64) NOT NULL,
x_offset_20 varchar(32) NOT NULL,
y_offset_20 varchar(32) NOT NULL,
operator_name varchar(32) NOT NULL,
network_class varchar(32) NOT NULL,
freq varchar(32) NOT NULL DEFAULT 'all',
indoor_flag smallint NOT NULL DEFAULT -1,
building_name varchar(128),
provincecode integer,
citycode integer,
districtcode integer,
grid_wkt text,
grid_geom geometry(Polygon, 4326) GENERATED ALWAYS AS (
CASE WHEN grid_wkt IS NULL THEN NULL
ELSE ST_GeomFromText(grid_wkt, 4326)::geometry(Polygon, 4326)
END
) STORED,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, data_type, building_id, regionid, x_offset_20, y_offset_20, operator_name, network_class, freq, indoor_flag)
);
COMMENT ON TABLE dmk.td_building_grid_m IS '楼宇栅格桥接月表,支撑 /api/buildings/layer 和楼宇-栅格关联。';
COMMENT ON COLUMN dmk.td_building_grid_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.td_building_grid_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.td_building_grid_m.building_id IS '楼宇 ID';
COMMENT ON COLUMN dmk.td_building_grid_m.regionid IS '栅格区域 ID';
COMMENT ON COLUMN dmk.td_building_grid_m.x_offset_20 IS '栅格 X 偏移';
COMMENT ON COLUMN dmk.td_building_grid_m.y_offset_20 IS '栅格 Y 偏移';
COMMENT ON COLUMN dmk.td_building_grid_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.td_building_grid_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.td_building_grid_m.freq IS '频段';
COMMENT ON COLUMN dmk.td_building_grid_m.indoor_flag IS '室内外标识';
COMMENT ON COLUMN dmk.td_building_grid_m.building_name IS '楼宇名称(冗余)';
COMMENT ON COLUMN dmk.td_building_grid_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.td_building_grid_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.td_building_grid_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.td_building_grid_m.grid_wkt IS '栅格 WKTEPSG:4326';
COMMENT ON COLUMN dmk.td_building_grid_m.grid_geom IS '由 grid_wkt 生成的 Polygon 几何列';
COMMENT ON COLUMN dmk.td_building_grid_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_td_building_grid_query ON dmk.td_building_grid_m(year_month, data_type, provincecode, citycode, districtcode, operator_name, network_class, freq, indoor_flag);
CREATE INDEX IF NOT EXISTS idx_td_building_grid_geom ON dmk.td_building_grid_m USING gist(grid_geom) WHERE grid_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.td_building_cell_m (
year_month varchar(7) NOT NULL,
data_type integer NOT NULL,
building_id varchar(64) NOT NULL,
cellkey varchar(64) NOT NULL,
cell_name varchar(128),
operator_name varchar(32) NOT NULL,
network_class varchar(32) NOT NULL,
freq varchar(32) NOT NULL DEFAULT 'all',
indoor_flag smallint NOT NULL DEFAULT -1,
provincecode integer,
citycode integer,
districtcode integer,
cell_lon numeric(10, 6),
cell_lat numeric(10, 6),
cell_wkt text,
cell_geom geometry(Point, 4326) GENERATED ALWAYS AS (
CASE WHEN cell_wkt IS NOT NULL THEN ST_GeomFromText(cell_wkt, 4326)::geometry(Point, 4326)
WHEN cell_lon IS NOT NULL AND cell_lat IS NOT NULL THEN ST_SetSRID(ST_MakePoint(cell_lon, cell_lat), 4326)::geometry(Point, 4326)
ELSE NULL
END
) STORED,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, data_type, building_id, cellkey, operator_name, network_class, freq, indoor_flag)
);
COMMENT ON TABLE dmk.td_building_cell_m IS '楼宇小区桥接月表,支撑 /api/buildings/cells 与楼宇-小区关联。';
COMMENT ON COLUMN dmk.td_building_cell_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.td_building_cell_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.td_building_cell_m.building_id IS '楼宇 ID';
COMMENT ON COLUMN dmk.td_building_cell_m.cellkey IS '小区唯一键 cellkey';
COMMENT ON COLUMN dmk.td_building_cell_m.cell_name IS '小区名称(冗余)';
COMMENT ON COLUMN dmk.td_building_cell_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.td_building_cell_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.td_building_cell_m.freq IS '频段';
COMMENT ON COLUMN dmk.td_building_cell_m.indoor_flag IS '室内外标识';
COMMENT ON COLUMN dmk.td_building_cell_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.td_building_cell_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.td_building_cell_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.td_building_cell_m.cell_lon IS '小区经度';
COMMENT ON COLUMN dmk.td_building_cell_m.cell_lat IS '小区纬度';
COMMENT ON COLUMN dmk.td_building_cell_m.cell_wkt IS '小区点 WKT';
COMMENT ON COLUMN dmk.td_building_cell_m.cell_geom IS '小区点几何列(由 cell_wkt 或经纬度生成)';
COMMENT ON COLUMN dmk.td_building_cell_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_td_building_cell_query ON dmk.td_building_cell_m(year_month, data_type, provincecode, citycode, districtcode, operator_name, network_class, freq, indoor_flag);
CREATE INDEX IF NOT EXISTS idx_td_building_cell_geom ON dmk.td_building_cell_m USING gist(cell_geom) WHERE cell_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.tm_cell_grid_coverage_m (
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
data_type integer NOT NULL,
operator_name varchar(32) NOT NULL,
network_class varchar(32) NOT NULL,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
cellkey varchar(64) NOT NULL,
cell_name varchar(128),
cell_lon numeric(10, 6),
cell_lat numeric(10, 6),
cell_wkt text,
cell_geom geometry(Point, 4326) GENERATED ALWAYS AS (
CASE WHEN cell_wkt IS NOT NULL THEN ST_GeomFromText(cell_wkt, 4326)::geometry(Point, 4326)
WHEN cell_lon IS NOT NULL AND cell_lat IS NOT NULL THEN ST_SetSRID(ST_MakePoint(cell_lon, cell_lat), 4326)::geometry(Point, 4326)
ELSE NULL
END
) STORED,
pci varchar(32),
indoor_flag smallint NOT NULL DEFAULT -1,
azimuth integer,
freq varchar(32) NOT NULL DEFAULT 'all',
vendor varchar(64),
antenna_height numeric(10, 2),
mechanical_downdip numeric(10, 2),
electron_downdip numeric(10, 2),
cover_type varchar(64),
rspower numeric(12, 4),
regionid varchar(64) NOT NULL,
x_offset_20 varchar(32) NOT NULL,
y_offset_20 varchar(32) NOT NULL,
grid_lon numeric(10, 6),
grid_lat numeric(10, 6),
grid_wkt text,
grid_geom geometry(Polygon, 4326) GENERATED ALWAYS AS (
CASE WHEN grid_wkt IS NULL THEN NULL
ELSE ST_GeomFromText(grid_wkt, 4326)::geometry(Polygon, 4326)
END
) STORED,
cell_grid_line_wkt text,
cell_grid_line_geom geometry(LineString, 4326) GENERATED ALWAYS AS (
CASE WHEN cell_grid_line_wkt IS NULL THEN NULL
ELSE ST_GeomFromText(cell_grid_line_wkt, 4326)::geometry(LineString, 4326)
END
) STORED,
rsrpcount bigint NOT NULL DEFAULT 0,
totalrsrp numeric(20, 4),
totalsinr numeric(20, 4),
avgrsrp numeric(10, 4),
avg_sinr numeric(10, 4),
rsrpgoodcount_105 bigint NOT NULL DEFAULT 0,
rsrpgoodcount_110 bigint NOT NULL DEFAULT 0,
mr_cover_rate_105 numeric(12, 6),
mr_cover_rate_110 numeric(12, 6),
weakcover_mrcount bigint NOT NULL DEFAULT 0,
overlap_mrcount bigint NOT NULL DEFAULT 0,
overlap_total_value numeric(20, 4),
overlap_rate numeric(12, 6),
overlap_avgrsrp numeric(10, 4),
overshoot_mrcount bigint NOT NULL DEFAULT 0,
overshoot_total_value numeric(20, 4),
overshoot_rate numeric(12, 6),
overshoot_avgrsrp numeric(10, 4),
mod_interference_mrcount bigint NOT NULL DEFAULT 0,
mod_interference_total_value numeric(20, 4),
mod_interference_avgrsrp numeric(10, 4),
mod_interference_ratio numeric(12, 6),
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, data_type, operator_name, network_class, freq, indoor_flag, cellkey, regionid, x_offset_20, y_offset_20)
);
COMMENT ON TABLE dmk.tm_cell_grid_coverage_m IS '小区覆盖栅格月表,支撑单小区覆盖栅格、栅格 TOP 小区和栅格-小区连线。';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.year IS '账期年份';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.month IS '账期月份';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cellkey IS '小区唯一键 cellkey';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cell_name IS '小区名称';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cell_lon IS '小区经度';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cell_lat IS '小区纬度';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cell_wkt IS '小区点 WKT';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cell_geom IS '小区点几何列';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.pci IS '物理小区标识 PCI';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.indoor_flag IS '室内外标识';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.azimuth IS '天线方位角(度)';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.freq IS '频段';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.vendor IS '设备厂家';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.antenna_height IS '天线挂高(米)';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.mechanical_downdip IS '机械下倾角';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.electron_downdip IS '电子下倾角';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cover_type IS '覆盖类型';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.rspower IS '参考信号发射功率';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.regionid IS '覆盖栅格区域 ID';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.x_offset_20 IS '覆盖栅格 X 偏移';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.y_offset_20 IS '覆盖栅格 Y 偏移';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.grid_lon IS '覆盖栅格中心点经度';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.grid_lat IS '覆盖栅格中心点纬度';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.grid_wkt IS '覆盖栅格 WKT';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.grid_geom IS '覆盖栅格 Polygon 几何列';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cell_grid_line_wkt IS '小区→栅格连线 WKTLineString';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.cell_grid_line_geom IS '小区→栅格连线 LineString 几何列';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.rsrpcount IS '该小区在该栅格的 MR 采样数';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.totalrsrp IS 'RSRP 累加值';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.totalsinr IS 'SINR 累加值';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.avgrsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.avg_sinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.rsrpgoodcount_105 IS 'RSRP≥-105 的采样数';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.rsrpgoodcount_110 IS 'RSRP≥-110 的采样数';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.mr_cover_rate_105 IS 'MR 覆盖率(-105)';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.mr_cover_rate_110 IS 'MR 覆盖率(-110)';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.weakcover_mrcount IS '弱覆盖采样数';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.overlap_mrcount IS '重叠覆盖采样数';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.overlap_total_value IS '重叠覆盖总值';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.overlap_rate IS '重叠覆盖率';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.overlap_avgrsrp IS '重叠覆盖平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.overshoot_mrcount IS '过覆盖采样数';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.overshoot_total_value IS '过覆盖总值';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.overshoot_rate IS '过覆盖率';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.overshoot_avgrsrp IS '过覆盖平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.mod_interference_mrcount IS 'MOD 干扰采样数4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.mod_interference_total_value IS 'MOD 干扰采样点总值4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.mod_interference_avgrsrp IS 'MOD 干扰平均 RSRPdBm4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.mod_interference_ratio IS 'MOD 干扰占比4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_cell_grid_coverage_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_cell_grid_cell ON dmk.tm_cell_grid_coverage_m(year_month, cellkey, network_class, rsrpcount DESC);
CREATE INDEX IF NOT EXISTS idx_tm_cell_grid_grid ON dmk.tm_cell_grid_coverage_m(year_month, regionid, x_offset_20, y_offset_20, operator_name, network_class, rsrpcount DESC);
CREATE INDEX IF NOT EXISTS idx_tm_cell_grid_cell_geom ON dmk.tm_cell_grid_coverage_m USING gist(cell_geom) WHERE cell_geom IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_tm_cell_grid_grid_geom ON dmk.tm_cell_grid_coverage_m USING gist(grid_geom) WHERE grid_geom IS NOT NULL;
-- =========================================================
-- 6. 聚类、加权得分与质差指标表
-- =========================================================
CREATE TABLE IF NOT EXISTS dmk.tm_cluster_area_m (
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
data_type integer NOT NULL,
cluster_id varchar(64) NOT NULL,
cluster_name varchar(128),
cluster_type varchar(64) NOT NULL,
top_type varchar(32) NOT NULL DEFAULT 'all',
network_class varchar(32) NOT NULL,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
center_lon numeric(10, 6),
center_lat numeric(10, 6),
bbox numeric(10, 6)[],
area_wkt text,
area_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
CASE WHEN area_wkt IS NULL THEN NULL
ELSE ST_Multi(ST_GeomFromText(area_wkt, 4326))::geometry(MultiPolygon, 4326)
END
) STORED,
grid_count bigint NOT NULL DEFAULT 0,
covered_grid_count bigint NOT NULL DEFAULT 0,
weak_grid_count bigint NOT NULL DEFAULT 0,
weak_grid_ratio numeric(12, 6),
area_size numeric(18, 4),
perimeter numeric(18, 4),
weighted_score numeric(12, 6),
business_score numeric(12, 6),
area_score numeric(12, 6),
value_score numeric(12, 6),
coverage_score numeric(12, 6),
user_score numeric(12, 6),
rsrpcount bigint NOT NULL DEFAULT 0,
weakcover_mrcount bigint NOT NULL DEFAULT 0,
overlap_mrcount bigint NOT NULL DEFAULT 0,
overlap_total_value numeric(20, 4),
overlap_rate numeric(12, 6),
overlap_avgrsrp numeric(10, 4),
overshoot_mrcount bigint NOT NULL DEFAULT 0,
overshoot_total_value numeric(20, 4),
overshoot_rate numeric(12, 6),
overshoot_avgrsrp numeric(10, 4),
mod_interference_mrcount bigint NOT NULL DEFAULT 0,
mod_interference_total_value numeric(20, 4),
mod_interference_avgrsrp numeric(10, 4),
mod_interference_ratio numeric(12, 6),
avg_rsrp numeric(10, 4),
avg_sinr numeric(10, 4),
mr_cover_rate numeric(12, 6),
total_user_count bigint,
user_count_4g bigint,
user_count_5g bigint,
user_density numeric(18, 4),
high_value_user_ratio numeric(12, 6),
avg_arpu numeric(12, 4),
vip_user_count bigint,
total_traffic_gb numeric(18, 4),
voice_minutes numeric(18, 4),
video_user_ratio numeric(12, 6),
related_scene_count integer,
is_feedback smallint NOT NULL DEFAULT 0,
rank_no integer,
percent_rank numeric(12, 6),
feedback_source varchar(32),
update_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, cluster_id)
);
COMMENT ON TABLE dmk.tm_cluster_area_m IS '聚类区域月表,支撑聚类清单、加权得分、多维分析和聚类区域 WMS。';
COMMENT ON COLUMN dmk.tm_cluster_area_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_cluster_area_m.year IS '账期年份';
COMMENT ON COLUMN dmk.tm_cluster_area_m.month IS '账期月份';
COMMENT ON COLUMN dmk.tm_cluster_area_m.data_type IS '数据来源类型';
COMMENT ON COLUMN dmk.tm_cluster_area_m.cluster_id IS '聚类区域 ID';
COMMENT ON COLUMN dmk.tm_cluster_area_m.cluster_name IS '聚类区域名称';
COMMENT ON COLUMN dmk.tm_cluster_area_m.cluster_type IS '聚类类型(弱覆盖/超忙/综合质差等)';
COMMENT ON COLUMN dmk.tm_cluster_area_m.top_type IS 'TOP 档位标识top10/top50/all 等';
COMMENT ON COLUMN dmk.tm_cluster_area_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.tm_cluster_area_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_cluster_area_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_cluster_area_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_cluster_area_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_cluster_area_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_cluster_area_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_cluster_area_m.center_lon IS '聚类区域中心点经度';
COMMENT ON COLUMN dmk.tm_cluster_area_m.center_lat IS '聚类区域中心点纬度';
COMMENT ON COLUMN dmk.tm_cluster_area_m.bbox IS '聚类区域外接矩形';
COMMENT ON COLUMN dmk.tm_cluster_area_m.area_wkt IS '聚类区域 WKTEPSG:4326';
COMMENT ON COLUMN dmk.tm_cluster_area_m.area_geom IS '聚类区域 MultiPolygon 几何列';
COMMENT ON COLUMN dmk.tm_cluster_area_m.grid_count IS '聚类区域内栅格总数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.covered_grid_count IS '聚类区域内已覆盖栅格数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.weak_grid_count IS '聚类区域内弱覆盖栅格数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.weak_grid_ratio IS '弱覆盖栅格占比';
COMMENT ON COLUMN dmk.tm_cluster_area_m.area_size IS '聚类区域面积(平方米)';
COMMENT ON COLUMN dmk.tm_cluster_area_m.perimeter IS '聚类区域周长(米)';
COMMENT ON COLUMN dmk.tm_cluster_area_m.weighted_score IS '聚类加权综合得分';
COMMENT ON COLUMN dmk.tm_cluster_area_m.business_score IS '业务维度得分';
COMMENT ON COLUMN dmk.tm_cluster_area_m.area_score IS '区域维度得分';
COMMENT ON COLUMN dmk.tm_cluster_area_m.value_score IS '价值维度得分';
COMMENT ON COLUMN dmk.tm_cluster_area_m.coverage_score IS '覆盖维度得分';
COMMENT ON COLUMN dmk.tm_cluster_area_m.user_score IS '用户维度得分';
COMMENT ON COLUMN dmk.tm_cluster_area_m.rsrpcount IS '聚类区域内 RSRP 采样点数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.weakcover_mrcount IS '聚类区域内弱覆盖采样数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.overlap_mrcount IS '聚类区域内重叠覆盖采样数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.overlap_total_value IS '聚类区域内重叠覆盖总值';
COMMENT ON COLUMN dmk.tm_cluster_area_m.overlap_rate IS '聚类区域内重叠覆盖率';
COMMENT ON COLUMN dmk.tm_cluster_area_m.overlap_avgrsrp IS '聚类区域内重叠覆盖平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_cluster_area_m.overshoot_mrcount IS '聚类区域内过覆盖采样数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.overshoot_total_value IS '聚类区域内过覆盖总值';
COMMENT ON COLUMN dmk.tm_cluster_area_m.overshoot_rate IS '聚类区域内过覆盖率';
COMMENT ON COLUMN dmk.tm_cluster_area_m.overshoot_avgrsrp IS '聚类区域内过覆盖平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_cluster_area_m.mod_interference_mrcount IS '聚类区域内 MOD 干扰采样数4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_cluster_area_m.mod_interference_total_value IS '聚类区域内 MOD 干扰采样点总值4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_cluster_area_m.mod_interference_avgrsrp IS '聚类区域内 MOD 干扰平均 RSRPdBm4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_cluster_area_m.mod_interference_ratio IS '聚类区域内 MOD 干扰占比4G 按 MOD3、5G 按 MOD30 解释';
COMMENT ON COLUMN dmk.tm_cluster_area_m.avg_rsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_cluster_area_m.avg_sinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_cluster_area_m.mr_cover_rate IS 'MR 覆盖率';
COMMENT ON COLUMN dmk.tm_cluster_area_m.total_user_count IS '区域内总用户数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.user_count_4g IS '4G 用户数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.user_count_5g IS '5G 用户数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.user_density IS '用户密度(人/平方公里)';
COMMENT ON COLUMN dmk.tm_cluster_area_m.high_value_user_ratio IS '高价值用户占比';
COMMENT ON COLUMN dmk.tm_cluster_area_m.avg_arpu IS '平均 ARPU';
COMMENT ON COLUMN dmk.tm_cluster_area_m.vip_user_count IS 'VIP 用户数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.total_traffic_gb IS '总流量GB';
COMMENT ON COLUMN dmk.tm_cluster_area_m.voice_minutes IS '语音业务时长(分钟)';
COMMENT ON COLUMN dmk.tm_cluster_area_m.video_user_ratio IS '视频用户占比';
COMMENT ON COLUMN dmk.tm_cluster_area_m.related_scene_count IS '关联场景数';
COMMENT ON COLUMN dmk.tm_cluster_area_m.is_feedback IS '是否已反馈0=未反馈 1=已反馈';
COMMENT ON COLUMN dmk.tm_cluster_area_m.rank_no IS '加权得分排名(同档位内)';
COMMENT ON COLUMN dmk.tm_cluster_area_m.percent_rank IS '排名分位数0-1';
COMMENT ON COLUMN dmk.tm_cluster_area_m.feedback_source IS '反馈来源manual/system/external 等)';
COMMENT ON COLUMN dmk.tm_cluster_area_m.update_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_cluster_area_filter ON dmk.tm_cluster_area_m(year_month, data_type, provincecode, citycode, network_class, cluster_type, top_type, weighted_score DESC);
CREATE INDEX IF NOT EXISTS idx_tm_cluster_area_geom ON dmk.tm_cluster_area_m USING gist(area_geom) WHERE area_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.tm_cluster_feedback (
feedback_id varchar(64) PRIMARY KEY,
year_month varchar(7) NOT NULL,
cluster_id varchar(64) NOT NULL,
problem_reason_type varchar(64) NOT NULL,
solution_type varchar(64) NOT NULL,
problem_desc text NOT NULL,
solution_desc text NOT NULL,
feedback_user varchar(64) NOT NULL,
feedback_source varchar(32) NOT NULL DEFAULT 'manual',
is_feedback smallint NOT NULL DEFAULT 1,
updated_by varchar(64),
update_time timestamp without time zone NOT NULL DEFAULT now()
);
COMMENT ON TABLE dmk.tm_cluster_feedback IS '质差聚类区域反馈表,保存问题根因、解决措施和反馈来源。';
COMMENT ON COLUMN dmk.tm_cluster_feedback.feedback_id IS '反馈记录 ID';
COMMENT ON COLUMN dmk.tm_cluster_feedback.year_month IS '所属账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_cluster_feedback.cluster_id IS '聚类区域 ID';
COMMENT ON COLUMN dmk.tm_cluster_feedback.problem_reason_type IS '问题根因类型编码';
COMMENT ON COLUMN dmk.tm_cluster_feedback.solution_type IS '解决措施类型编码';
COMMENT ON COLUMN dmk.tm_cluster_feedback.problem_desc IS '问题描述(自由文本)';
COMMENT ON COLUMN dmk.tm_cluster_feedback.solution_desc IS '解决措施描述(自由文本)';
COMMENT ON COLUMN dmk.tm_cluster_feedback.feedback_user IS '反馈提交用户账号';
COMMENT ON COLUMN dmk.tm_cluster_feedback.feedback_source IS '反馈来源manual/system/external 等';
COMMENT ON COLUMN dmk.tm_cluster_feedback.is_feedback IS '是否有效反馈1=是 0=已撤销';
COMMENT ON COLUMN dmk.tm_cluster_feedback.updated_by IS '最后更新人账号';
COMMENT ON COLUMN dmk.tm_cluster_feedback.update_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_cluster_feedback_query ON dmk.tm_cluster_feedback(year_month, cluster_id, update_time DESC);
CREATE TABLE IF NOT EXISTS dmk.tm_poor_region_metric_m (
year_month varchar(7) NOT NULL,
year integer NOT NULL,
month integer NOT NULL,
region_level varchar(16) NOT NULL,
region_code integer NOT NULL,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
stat_type varchar(32) NOT NULL,
poor_type varchar(32) NOT NULL,
metric_group varchar(64) NOT NULL,
scene_type varchar(64) NOT NULL DEFAULT 'all',
scene_type_name varchar(128),
network_class varchar(32) NOT NULL DEFAULT 'all',
metric_code varchar(64) NOT NULL,
metric_name varchar(128),
metric_value numeric(20, 6),
rank_no integer,
scene_count bigint,
cell_count bigint,
traffic_count numeric(20, 6),
poor_scene_count bigint,
poor_cell_count bigint,
busy_cell_count bigint,
region_wkt text,
region_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
CASE WHEN region_wkt IS NULL THEN NULL
ELSE ST_Multi(ST_GeomFromText(region_wkt, 4326))::geometry(MultiPolygon, 4326)
END
) STORED,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, region_level, region_code, stat_type, poor_type, metric_group, scene_type, network_class, metric_code)
);
COMMENT ON TABLE dmk.tm_poor_region_metric_m IS '质差区域指标月表统一支撑概览、走势、GIS 地图和指标排名。';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.year IS '账期年份';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.month IS '账期月份';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.region_level IS '区域级别';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.region_code IS '区域编码';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.stat_type IS '统计页签类型(概览/趋势/地图/排名)';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.poor_type IS '质差类型(弱覆盖/超忙/感知差等)';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.metric_group IS '指标分组';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.scene_type IS '场景类型all 表示全部场景';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.scene_type_name IS '场景类型名称';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.metric_code IS '指标编码';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.metric_name IS '指标名称';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.metric_value IS '指标值';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.rank_no IS '排名序号';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.scene_count IS '场景数量';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.cell_count IS '小区数量';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.traffic_count IS '业务量统计值';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.poor_scene_count IS '质差场景数量';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.poor_cell_count IS '质差小区数量';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.busy_cell_count IS '超忙小区数量';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.region_wkt IS '区域 WKTEPSG:4326';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.region_geom IS '区域 MultiPolygon 几何列';
COMMENT ON COLUMN dmk.tm_poor_region_metric_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_poor_region_metric_query ON dmk.tm_poor_region_metric_m(year_month, region_level, provincecode, citycode, stat_type, poor_type, metric_group, scene_type, network_class, metric_code, rank_no);
CREATE INDEX IF NOT EXISTS idx_tm_poor_region_metric_geom ON dmk.tm_poor_region_metric_m USING gist(region_geom) WHERE region_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.tm_poor_scene_list_m (
year_month varchar(7) NOT NULL,
poor_scene_id varchar(64) NOT NULL,
poor_type varchar(32) NOT NULL,
metric_group varchar(64) NOT NULL,
scene_id varchar(64) NOT NULL,
scene_name varchar(128) NOT NULL,
scene_type varchar(64) NOT NULL,
scene_type_name varchar(128),
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
center_lon numeric(10, 6),
center_lat numeric(10, 6),
bbox numeric(10, 6)[],
aoi_wkt text,
aoi_geom geometry(MultiPolygon, 4326) GENERATED ALWAYS AS (
CASE WHEN aoi_wkt IS NULL THEN NULL
ELSE ST_Multi(ST_GeomFromText(aoi_wkt, 4326))::geometry(MultiPolygon, 4326)
END
) STORED,
avg_rsrp numeric(10, 4),
avg_sinr numeric(10, 4),
grid_count bigint,
weak_grid_count bigint,
weak_grid_ratio numeric(12, 6),
grid_cover_rate numeric(12, 6),
mr_cover_rate numeric(12, 6),
total_user_count bigint,
total_traffic_gb numeric(18, 4),
voice_drop_rate numeric(12, 6),
perception_score numeric(12, 6),
rank_no integer,
poor_reason varchar(128),
poor_reason_name varchar(128),
update_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, poor_scene_id)
);
COMMENT ON TABLE dmk.tm_poor_scene_list_m IS '质差场景清单月表,支撑清单查询、排序和导出。';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.poor_scene_id IS '质差场景记录 ID';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.poor_type IS '质差类型';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.metric_group IS '指标分组';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.scene_id IS '场景 ID';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.scene_name IS '场景名称';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.scene_type IS '场景类型编码';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.scene_type_name IS '场景类型名称';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.center_lon IS '场景中心点经度';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.center_lat IS '场景中心点纬度';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.bbox IS '场景外接矩形';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.aoi_wkt IS '场景 AOI WKT';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.aoi_geom IS '场景 AOI MultiPolygon 几何列';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.avg_rsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.avg_sinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.grid_count IS '场景内栅格数';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.weak_grid_count IS '弱覆盖栅格数';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.weak_grid_ratio IS '弱覆盖栅格占比';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.grid_cover_rate IS '栅格覆盖率';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.mr_cover_rate IS 'MR 覆盖率';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.total_user_count IS '场景内总用户数';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.total_traffic_gb IS '总流量GB';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.voice_drop_rate IS '语音掉话率';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.perception_score IS '感知评分';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.rank_no IS '清单内排名';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.poor_reason IS '质差原因编码';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.poor_reason_name IS '质差原因名称';
COMMENT ON COLUMN dmk.tm_poor_scene_list_m.update_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_poor_scene_list_query ON dmk.tm_poor_scene_list_m(year_month, provincecode, citycode, scene_type, rank_no, grid_cover_rate);
CREATE INDEX IF NOT EXISTS idx_tm_poor_scene_list_geom ON dmk.tm_poor_scene_list_m USING gist(aoi_geom) WHERE aoi_geom IS NOT NULL;
CREATE TABLE IF NOT EXISTS dmk.tm_poor_cell_list_m (
year_month varchar(7) NOT NULL,
poor_cell_id varchar(64) NOT NULL,
poor_type varchar(32) NOT NULL,
metric_group varchar(64),
cellkey varchar(64) NOT NULL,
cell_name varchar(128),
operator_name varchar(32),
network_class varchar(32) NOT NULL,
provincecode integer,
province_name varchar(64),
citycode integer,
city_name varchar(64),
districtcode integer,
district_name varchar(64),
scene_id varchar(64),
scene_name varchar(128),
scene_type varchar(64),
scene_type_name varchar(128),
cell_lon numeric(10, 6),
cell_lat numeric(10, 6),
cell_wkt text,
cell_geom geometry(Point, 4326) GENERATED ALWAYS AS (
CASE WHEN cell_wkt IS NOT NULL THEN ST_GeomFromText(cell_wkt, 4326)::geometry(Point, 4326)
WHEN cell_lon IS NOT NULL AND cell_lat IS NOT NULL THEN ST_SetSRID(ST_MakePoint(cell_lon, cell_lat), 4326)::geometry(Point, 4326)
ELSE NULL
END
) STORED,
rsrpcount bigint,
avg_rsrp numeric(10, 4),
avg_sinr numeric(10, 4),
weakcover_mrcount bigint,
busy_user_count bigint,
traffic_total numeric(18, 4),
total_traffic_gb numeric(18, 4),
voice_drop_rate numeric(12, 6),
perception_score numeric(12, 6),
rank_no integer,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
PRIMARY KEY (year_month, poor_cell_id)
);
COMMENT ON TABLE dmk.tm_poor_cell_list_m IS '质差小区/超忙小区清单月表,保留 traffic_total 与 total_traffic_gb 兼容导出。';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.year_month IS '账期,格式 YYYY-MM';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.poor_cell_id IS '质差小区记录 ID';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.poor_type IS '质差类型(质差/超忙等)';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.metric_group IS '指标分组';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.cellkey IS '小区唯一键 cellkey';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.cell_name IS '小区名称';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.operator_name IS '运营商名称';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.network_class IS '网络制式';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.provincecode IS '省编码';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.province_name IS '省名称';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.citycode IS '地市编码';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.city_name IS '地市名称';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.districtcode IS '区县编码';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.district_name IS '区县名称';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.scene_id IS '关联场景 ID';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.scene_name IS '关联场景名称';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.scene_type IS '关联场景类型编码';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.scene_type_name IS '关联场景类型名称';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.cell_lon IS '小区经度';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.cell_lat IS '小区纬度';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.cell_wkt IS '小区点 WKT';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.cell_geom IS '小区点几何列';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.rsrpcount IS 'MR 采样数';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.avg_rsrp IS '平均 RSRPdBm';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.avg_sinr IS '平均 SINRdB';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.weakcover_mrcount IS '弱覆盖采样数';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.busy_user_count IS '忙时用户数';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.traffic_total IS '业务量原始单位(兼容导出口径)';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.total_traffic_gb IS '总流量GB';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.voice_drop_rate IS '语音掉话率';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.perception_score IS '感知评分';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.rank_no IS '清单内排名';
COMMENT ON COLUMN dmk.tm_poor_cell_list_m.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_poor_cell_list_query ON dmk.tm_poor_cell_list_m(year_month, provincecode, citycode, poor_type, network_class, rank_no);
CREATE INDEX IF NOT EXISTS idx_tm_poor_cell_list_geom ON dmk.tm_poor_cell_list_m USING gist(cell_geom) WHERE cell_geom IS NOT NULL;
-- =========================================================
-- 7. 导出任务表
-- =========================================================
CREATE TABLE IF NOT EXISTS dmk.tm_export_task (
task_id varchar(64) PRIMARY KEY,
account_id varchar(64) NOT NULL,
tenant varchar(64),
biz_module varchar(64) NOT NULL,
export_type varchar(64),
request_param jsonb,
export_columns varchar(128)[] NOT NULL DEFAULT ARRAY[]::varchar[],
status varchar(32) NOT NULL,
progress integer NOT NULL DEFAULT 0,
file_name varchar(256),
file_url text,
file_size bigint,
error_msg text,
created_time timestamp without time zone NOT NULL DEFAULT now(),
finish_time timestamp without time zone,
updated_time timestamp without time zone NOT NULL DEFAULT now(),
CHECK (status IN ('pending', 'processing', 'running', 'success', 'failed', 'canceled')),
CHECK (progress BETWEEN 0 AND 100)
);
COMMENT ON TABLE dmk.tm_export_task IS '异步导出任务表,支撑导出详情、列表、取消、下载接口。';
COMMENT ON COLUMN dmk.tm_export_task.task_id IS '导出任务 ID';
COMMENT ON COLUMN dmk.tm_export_task.account_id IS '发起账号 ID';
COMMENT ON COLUMN dmk.tm_export_task.tenant IS '租户标识';
COMMENT ON COLUMN dmk.tm_export_task.biz_module IS '业务模块building/scene/cluster/poor 等)';
COMMENT ON COLUMN dmk.tm_export_task.export_type IS '导出类型excel/csv 等)';
COMMENT ON COLUMN dmk.tm_export_task.request_param IS '导出请求参数 JSON 快照';
COMMENT ON COLUMN dmk.tm_export_task.export_columns IS '导出字段列表(数组)';
COMMENT ON COLUMN dmk.tm_export_task.status IS '任务状态pending/processing/running/success/failed/canceled';
COMMENT ON COLUMN dmk.tm_export_task.progress IS '任务进度0-100';
COMMENT ON COLUMN dmk.tm_export_task.file_name IS '导出文件名';
COMMENT ON COLUMN dmk.tm_export_task.file_url IS '导出文件下载地址';
COMMENT ON COLUMN dmk.tm_export_task.file_size IS '导出文件大小(字节)';
COMMENT ON COLUMN dmk.tm_export_task.error_msg IS '错误信息(失败时填充)';
COMMENT ON COLUMN dmk.tm_export_task.created_time IS '任务创建时间';
COMMENT ON COLUMN dmk.tm_export_task.finish_time IS '任务完成时间';
COMMENT ON COLUMN dmk.tm_export_task.updated_time IS '记录更新时间';
CREATE INDEX IF NOT EXISTS idx_tm_export_task_query ON dmk.tm_export_task(account_id, biz_module, status, created_time DESC);