58 lines
2.2 KiB
SQL
Raw 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.

-- tm_building_user_wifi_m 楼宇 WiFi 指标月表 核心计算逻辑 (标准契约版)
-- 计算侧HiveSQL
-- 数据源ODS OTTWiFi 指标)
-- 输出:楼宇 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;