QuestDB的SAMPLE BY函数中声明变量或执行数学运算问题咨询
解决方案
QuestDB 目前的 SAMPLE BY 子句要求采样间隔必须为静态时间字面值,不支持运行时计算表达式,也暂未提供类 PostgreSQL 的会话变量声明功能,因此你需要从 Grafana 侧预处理变量,完全避开在 QuestDB 侧做运算,具体方案如下:
方案1:直接在 Grafana 插值阶段完成运算
Grafana 的变量插值逻辑会在发送 SQL 请求到数据库之前完成,你可以直接把算术运算写在变量占位符内,渲染后直接生成 QuestDB 可识别的字面值:
SELECT ts time, last(x), last(y), last(z) FROM accelerometer WHERE $__timeFilter(ts) SAMPLE BY ${__interval_ms / 1000}T
以你给出的场景为例,Grafana 处理后直接生成如下合法SQL发送给QuestDB:
SELECT ts time, last(x), last(y), last(z) FROM accelerometer WHERE ts BETWEEN '2021-10-12T00:00:00.000Z' AND '2021-10-12T01:00:00.000Z' SAMPLE BY 30T
无需修改任何数据库侧逻辑即可正常运行。
方案2:新增隐藏仪表盘变量(适用于复杂运算场景)
如果需要添加采样间隔阈值、自定义系数等更复杂的逻辑,可以新建一个仪表盘变量预计算采样值:
- 进入仪表盘设置 -> 变量 -> 新增变量
- 变量类型选择
Constant,名称设为sample_interval,值填写$__interval_ms / 1000(如有复杂判断可以用Grafana内置math函数编写逻辑) - 勾选「隐藏变量」选项,避免在仪表盘顶部显示
- SQL中直接引用变量即可:
SAMPLE BY ${sample_interval}T
失败原因说明
你之前的方案均是尝试在SQL运行阶段处理运算,不符合QuestDB的语法限制:
SAMPLE BY子句在SQL解析阶段就需要确定采样间隔,不会执行后续运行时的数值计算- QuestDB 暂不支持自定义会话变量,
DECLARE、WITH语句生成的变量都无法传递给SAMPLE BY子句
内容的提问来源于stack exchange,提问作者Jim Stroup
相关产品推荐
相关产品推荐

