-- 1. 全网电压合格率
SELECT
voltage_level,
COUNT(CASE WHEN voltage_a BETWEEN 209 AND 231 THEN 1 END) * 100.0 / COUNT(*)
AS qualified_pct
FROM substation_metrics
WHERE ts > NOW - 5m
PARTITION BY voltage_level;
-- 2. 重载线路
SELECT station_name, line_id, LAST(current_a) AS current_a
FROM substation_metrics
WHERE ts > NOW - 5m
PARTITION BY station_name, line_id
HAVING current_a > 800;
-- 3. 高负荷变电站
SELECT station_name,
MAX(active_power) AS max_power
FROM substation_metrics
WHERE ts > NOW - 1h
PARTITION BY station_name
ORDER BY max_power DESC LIMIT 10;
-- 4. 异常谐波
SELECT station_name, AVG(thd) AS avg_thd
FROM substation_metrics
WHERE ts > NOW - 1h
PARTITION BY station_name
HAVING avg_thd > 5;
4. 负荷预测分析
sql复制代码
-- 1. 日负荷曲线
SELECT _wstart, AVG(active_power) AS power
FROM substation_metrics
WHERE ts > NOW - 1d
INTERVAL(15m);
-- 2. 历史同期对比
SELECT
_wstart,
AVG(active_power) AS today,
(SELECT AVG(active_power) FROM substation_metrics
WHERE ts BETWEEN _wstart - 7d AND _wstart - 7d + 15m) AS last_week
FROM substation_metrics
WHERE ts > NOW - 1d
INTERVAL(15m);
-- 3. 用户用电模式
SELECT
HOUR(ts) AS hour, user_type,
AVG(power_now) AS avg_power
FROM meter_data
WHERE ts > NOW - 30d
GROUP BY hour, user_type
ORDER BY hour;
-- 4. 峰谷分析
SELECT
user_type,
MAX(power_now) AS peak,
MIN(power_now) AS valley,
MAX(power_now) / MIN(power_now) AS ratio
FROM meter_data
WHERE ts > NOW - 7d
PARTITION BY user_type;
5. 线损分析
sql复制代码
-- 1. 线路线损率
-- 线损 = (输入电量 - 输出电量) / 输入电量
WITH line_input AS (
SELECT line_id,
SUM(LAST(energy_active) - FIRST(energy_active)) AS in_kwh
FROM meter_data
WHERE user_type = 99 -- 关口表
AND ts > NOW - 30d
PARTITION BY line_id
),
line_output AS (
SELECT line_id,
SUM(LAST(energy_active) - FIRST(energy_active)) AS out_kwh
FROM meter_data
WHERE user_type != 99
AND ts > NOW - 30d
PARTITION BY line_id
)
SELECT
i.line_id,
i.in_kwh, o.out_kwh,
(i.in_kwh - o.out_kwh) * 100.0 / i.in_kwh AS loss_rate
FROM line_input i
JOIN line_output o ON i.line_id = o.line_id
ORDER BY loss_rate DESC;
6. 故障定位
sql复制代码
-- 1. 故障录波(保护动作前后波形)
SELECT ts, voltage_a, voltage_b, voltage_c,
current_a, current_b, current_c
FROM substation_metrics
WHERE station_id = 'ST001'
AND ts BETWEEN '2026-06-04 14:23:00' AND '2026-06-04 14:24:00'
ORDER BY ts;
-- 2. 故障定位
SELECT ts, switch_id, station_id, state, protection_op
FROM switch_status
WHERE protection_op > 0
AND ts > NOW - 1h
ORDER BY ts;
-- 3. 故障影响用户数(断电用户)
SELECT line_id, COUNT(DISTINCT user_id) AS affected
FROM meter_data
WHERE line_id IN (
SELECT DISTINCT line_id FROM switch_status
WHERE state = 0 AND ts > NOW - 1h
);
7. 新能源消纳
sql复制代码
-- 1. 新能源出力
SELECT _wstart, plant_type, SUM(power_active) AS total_mw
FROM renewable_generation
WHERE ts > NOW - 1d
PARTITION BY plant_type
INTERVAL(1h);
-- 2. 风光出力曲线(光伏 + 风电)
SELECT _wstart,
SUM(CASE WHEN plant_type=1 THEN power_active ELSE 0 END) AS wind_mw,
SUM(CASE WHEN plant_type=2 THEN power_active ELSE 0 END) AS solar_mw
FROM renewable_generation
WHERE ts > NOW - 1d
INTERVAL(1h);
-- 3. 弃风弃光率
WITH theoretical AS (
SELECT plant_id, SUM(capacity_mw) * 24 AS theory_mwh
FROM renewable_generation
WHERE ts > NOW - 1d
PARTITION BY plant_id
),
actual AS (
SELECT plant_id, SUM(power_active) AS actual_mw
FROM renewable_generation
WHERE ts > NOW - 1d
PARTITION BY plant_id
)
SELECT
a.plant_id,
(t.theory_mwh - a.actual_mw) / t.theory_mwh * 100 AS curtail_pct
FROM theoretical t JOIN actual a ON t.plant_id = a.plant_id;
8. 电能质量分析
sql复制代码
-- 1. 电压偏差统计
SELECT
station_name,
COUNT(CASE WHEN ABS(voltage_a - 220) > 22 THEN 1 END) AS deviations
FROM substation_metrics
WHERE ts > NOW - 1d
PARTITION BY station_name
ORDER BY deviations DESC LIMIT 20;
-- 2. 频率偏差(电网频率应稳定在 50Hz)
SELECT
station_name,
MAX(ABS(frequency - 50)) AS max_freq_dev
FROM substation_metrics
WHERE ts > NOW - 1d
PARTITION BY station_name;
-- 3. 三相不平衡
SELECT
station_name,
AVG((voltage_a + voltage_b + voltage_c) / 3 - voltage_a) AS imbalance_a,
AVG((voltage_a + voltage_b + voltage_c) / 3 - voltage_b) AS imbalance_b,
AVG((voltage_a + voltage_b + voltage_c) / 3 - voltage_c) AS imbalance_c
FROM substation_metrics
WHERE ts > NOW - 1h
PARTITION BY station_name;
代码示例
流计算实时电力告警
sql复制代码
-- 1. 电压越限告警
CREATE STREAM stream_voltage_alert TRIGGER AT_ONCE INTO voltage_alerts AS
SELECT ts, station_id, station_name,
voltage_a, voltage_b, voltage_c
FROM substation_metrics
WHERE voltage_a < 209 OR voltage_a > 231
OR voltage_b < 209 OR voltage_b > 231
OR voltage_c < 209 OR voltage_c > 231;
-- 2. 重载告警
CREATE STREAM stream_overload TRIGGER AT_ONCE INTO overload_alerts AS
SELECT ts, station_id, station_name, active_power
FROM substation_metrics
WHERE active_power > 80000; -- 80 MW
-- 3. 区域负荷统计
CREATE STREAM stream_region_load INTO region_load_15m AS
SELECT _wstart, region,
SUM(active_power) AS total_load
FROM substation_metrics
PARTITION BY region
INTERVAL(15m);
Python 故障实时定位
python复制代码
import taosws
consumer = taosws.Consumer({
'td.connect.user': 'root',
'td.connect.pass': 'taosdata',
'group.id': 'fault_locator',
'auto.offset.reset': 'latest',
})
consumer.subscribe(['voltage_alerts_topic'])
while True:
msg = consumer.poll(1)
if msg:
for record in msg:
for row in record:
# 查相关线路状态
nearby = query_nearby_switches(row['station_id'])
if any(s['state'] == 0 for s in nearby):
create_outage_ticket(row, nearby)
性能考量
数据规模
测点
频率
日量
100 万电表
1/min
1.5 亿条
100 万变电站测点
1/s
86 亿条
必要 TSMA
sql复制代码
CREATE TSMA tsma_sub_1m ON substation_metrics
FUNCTION(AVG(voltage_a), AVG(active_power), MAX(temperature))
INTERVAL(1m);
CREATE TSMA tsma_sub_1h ON substation_metrics
FUNCTION(AVG(voltage_a), AVG(active_power), MAX(temperature))
INTERVAL(1h);
CREATE TSMA tsma_meter_1h ON meter_data
FUNCTION(LAST(energy_active), AVG(power_now))
INTERVAL(1h);
FAQ
Q1: 电力数据如何保证不丢?
REPLICA=3
WAL fsync=2(同步)
边缘缓存 + 重传
定期数据完整性检查
Q2: 故障录波数据怎么存?
高频波形:
单独超级表
高频写入(事件触发)
短期保留(7~30 天)
Q3: 电量统计跨天怎么算?
LAST(energy) - FIRST(energy),按设备 PARTITION BY 然后按天 INTERVAL(1d)。
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。