官方给看看这流计算怎么执行不了。是bug 吗。

这流计算创建不了。TDengine 学习成本高的吓人

CREATE STREAM IF NOT EXISTS devices_db.stream_status_change
INTO devices_db.status_change_log
AS
SELECT
_wstart AS ts,
_wend AS end_ts,
_wduration AS duration_ms,
status,
dev_id,
shift
FROM devices_db.status_sensors
PARTITION BY tbname, dev_id, shift
STATE_WINDOW(status); 执行不了。 下面是背景 :

--创建状态切换日志表

CREATE STABLE devices_db.status_change_log (

ts TIMESTAMP,            -- 状态开始时间

end_ts TIMESTAMP,        -- 状态结束时间

duration_ms BIGINT,      -- 持续毫秒数

status TINYINT,          -- 状态值(0停机 1运行 2故障)

shift TINYINT            -- 班次(作为普通列,而不是TAG)

) TAGS (

dev_id BINARY(32)        -- 只有 dev_id 作为 TAG

);

-- 创建状态传感器超级表

CREATE STABLE devices_db.status_sensors (

ts timestamp,        -- 采集时间

status TINYINT ,     -- 设备当前状态

quality TINYINT ,     -- 数据质量

data_origin TINYINT , -- 数据来源(1:系统采集 2:手动输入 3: 从数据库导入 4: 其他)

shift TINYINT      -- 班次(1:早班 2:晚班) 

) TAGS (

 dev_id binary(32),        -- 设备编号

 dev_name nchar(16),       -- 设备名称

 dev_type nchar(16),       -- 设备类型

 dev_Model binary(32),      -- 设备型号

 line nchar(16),           -- 产线

 location  nchar (16),      -- 位置

 comm_protocol VARCHAR(16)        -- 通讯协议(Modbus/LoRa/NB-IoT)

);

CREATE STREAM IF NOT EXISTS stream_status_change
INTO devices_db.status_change_log
tags(dev_id binary(32))
AS
SELECT
_wstart AS ts,
_wend AS end_ts,
_wduration AS duration_ms,
status,
shift
FROM devices_db.status_sensors
PARTITION BY tbname, dev_id, shift
STATE_WINDOW(status);

目标表可以不提前创建,参考:流式计算 | TDengine 文档 | 涛思数据

把我提前创建的devices_db.status_change_log删了 ,CREATE STREAM IF NOT EXISTS stream_status_change
INTO devices_db.status_change_log
tags(dev_id binary(32))
AS
SELECT
_wstart AS ts,
_wend AS end_ts,
_wduration AS duration_ms,
status,
shift
FROM devices_db.status_sensors
PARTITION BY tbname, dev_id, shift
STATE_WINDOW(status);

[ 2026-05-22 11:23:08 ] 错误: { “code”: 9750, “desc”: " Internal error: `Database not specified`" }(执行: --; 网络: --; 总数: 35 ms)

切到对应库下执行

那就在流计算名前指定库名

哪个版本?不行的话就去后台CLI登录执行

server_version()
3.4.1.6.community

taos> CREATE STREAM IF NOT EXISTS devices_db.stream_status_change

INTO devices_db.status_change_log
tags(dev_id binary(32))
AS
SELECT
_wstart AS ts,
_wend AS end_ts,
_wduration AS duration_ms,
status,
shift
FROM devices_db.status_sensors
PARTITION BY tbname, dev_id, shift
STATE_WINDOW(status);

DB error: syntax error near “into devices_db.status_change_log tags(dev_id binary(32)) as select _wstart as ts, _wend as end_ts, _wduration as duration_ms, status, shift from devices_db.status_sensors partition by tbname, dev_id, shift state_window(status);” [0x80002600] (0.000170s)
taos>

taos> CREATE STREAM IF NOT EXISTS devices_db.stream_status_change

INTO devices_db.status_change_log
tags(dev_id binary(32))
AS
SELECT
_wstart AS ts,
_wend AS end_ts,
_wduration AS duration_ms,
status,
shift
FROM devices_db.status_sensors
PARTITION BY tbname, dev_id, shift
STATE_WINDOW(status);

DB error: syntax error near “into devices_db.status_change_log tags(dev_id binary(32)) as select _wstart as ts, _wend as end_ts, _wduration as duration_ms, status, shift from devices_db.status_sensors partition by tbname, dev_id, shift state_window(status);” [0x80002600] (0.000170s)
taos>

这是怎么了,是bug吗。我都研究2天了

语法不对,应该是:

CREATE STREAM IF NOT EXISTS devices_db.stream_status_change STATE_WINDOW(status)
FROM devices_db.status_sensors PARTITION BY tbname, dev_id
INTO devices_db.status_change_log TAGS(dev_id binary(32) as dev_id)
AS
SELECT
  _twstart AS ts,
  _twend AS end_ts,
  _twduration AS duration_ms,
  status,
  shift
FROM %%tbname
WHERE _c0 >= _twstart and _c0 <= _twend;

注意:这里 dev_id 是 tag 列,所以能用于 触发部分 的 PARTITION BY,而 shift 是普通列,不适用。

这个流的计算部分是简单的投影查询,计算结果的 status, shift 和窗口内最后一行的数据一致,如果这和您的需求不相符,可以更具体描述一下您期望的计算结果。

1 个赞

这是3.3.6.x版本的写法,3.4版本可以这样写:CREATE STREAM devices_db.stream_status_change
STATE_WINDOW(status)
FROM devices_db.status_sensors
PARTITION BY tbname
INTO devices_db.status_change_log
AS SELECT
_twstart AS ts,
_twend AS end_ts,
_twduration AS duration_ms,
status,
shift FROM %%tbname;

1 个赞

这两个都可以执行通过。