ctc_poc2026/POC-TSG匹配测试用例_DMK库表DDL(1).sql
2026-05-02 04:19:05 -04:00

1788 lines
105 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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