58 lines
2.2 KiB
SQL
58 lines
2.2 KiB
SQL
-- tm_building_user_wifi_m 楼宇 WiFi 指标月表 核心计算逻辑 (标准契约版)
|
||
-- 计算侧:HiveSQL
|
||
-- 数据源:ODS OTT(WiFi 指标)
|
||
-- 输出:楼宇 WiFi 用户数、市场份额、信号强度
|
||
|
||
-- 参数设置
|
||
-- SET hivevar:year_month='2026-05';
|
||
|
||
-- Step 1: 创建临时表关联楼宇信息
|
||
DROP TABLE IF EXISTS tmp_tm_building_user_wifi_m;
|
||
CREATE TABLE tmp_tm_building_user_wifi_m AS
|
||
SELECT
|
||
'${hivevar:year_month}' AS year_month,
|
||
b.building_id,
|
||
b.building_name,
|
||
b.building_type,
|
||
b.provincecode,
|
||
b.province_name,
|
||
b.citycode,
|
||
b.city_name,
|
||
b.districtcode,
|
||
b.district_name,
|
||
'telecom' AS operator_name,
|
||
-- 使用 LATERAL VIEW EXPLODE 展开数组后统计去重用户
|
||
approx_count_distinct(CASE WHEN w.wifi_name IS NOT NULL THEN exploded_device_id END) AS wifi_total_user_count,
|
||
approx_count_distinct(CASE WHEN w.wifi_name = 'ChinaNet' THEN exploded_device_id END) AS wifi_user_count,
|
||
-- WiFi 市场份额
|
||
CASE
|
||
WHEN approx_count_distinct(CASE WHEN w.wifi_name IS NOT NULL THEN exploded_device_id END) > 0
|
||
THEN approx_count_distinct(CASE WHEN w.wifi_name = 'ChinaNet' THEN exploded_device_id END) * 1.0 /
|
||
approx_count_distinct(CASE WHEN w.wifi_name IS NOT NULL THEN exploded_device_id END)
|
||
ELSE NULL
|
||
END AS wifi_market_share,
|
||
AVG(w.signal_strength) AS wifi_signal_strength
|
||
FROM (
|
||
SELECT building_id, building_name, building_type,
|
||
provincecode, province_name, citycode, city_name,
|
||
districtcode, district_name
|
||
FROM td_building
|
||
) b
|
||
LEFT JOIN (
|
||
SELECT building_id, wifi_name, device_id_list, signal_strength
|
||
FROM ODS_OTT_WIFI
|
||
WHERE year_month = '${hivevar:year_month}'
|
||
AND operator_name = 'telecom'
|
||
) w ON b.building_id = w.building_id
|
||
LATERAL VIEW EXPLODE(w.device_id_list) t AS exploded_device_id
|
||
GROUP BY
|
||
b.building_id, b.building_name, b.building_type,
|
||
b.provincecode, b.province_name, b.citycode, b.city_name,
|
||
b.districtcode, b.district_name
|
||
;
|
||
|
||
-- Step 2: 验证数据
|
||
-- SELECT COUNT(*) FROM tmp_tm_building_user_wifi_m;
|
||
-- SELECT year_month, building_id, wifi_total_user_count, wifi_user_count, wifi_market_share
|
||
-- FROM tmp_tm_building_user_wifi_m LIMIT 10;
|