TDengine在带有MAX() 的SELECT语句中,如何处理未在聚合函数中的列?

后端开发 2026-07-11

我在使用TDengine 3.3.6.13,并且有一个关于聚合函数的问题。

当我执行下面的查询:

SELECT MAX(a), b FROM my_table

我想知道查询结果中的b 列是否对应于a 取到最大值的那一行?

例如,如果我的表包含:

idab15"x"210"y"33"z"

结果会是10, "y"(a=10的那一行),还是会对 MAX(a) 返回10,而对b 返回其他值?

我查看了TDengine函数列表文档,其中写道:

标量函数对查询结果中的每一行返回一个结果行。

但这并没有清楚地解释在与聚合函数(如 MAX())组合时,非聚合列的行为。

环境:

  • TDengine版本:3.3.6.13
  • 部署:Docker

解决方案

在TDengine中,MAX() 被文档化为一个选择函数,而不仅仅是一个ANSI语义上的普通SQL聚合。选择函数根据函数的语义从输入结果集选择行,TDengine允许从选中的行返回其他列的值。

因此,对于你的示例,预期的结果是:

10, "y"

因为 "y" 来自于 a = 10 所在的那一行。

也就是说,我会把这点写清楚,而不是依赖那种看起来模糊的形式:

SELECT MAX(a), COLS(MAX(a), b)
FROM my_table;

COLS() 的设计初衷是从通过单行选择函数(如 MAX())所选中的那一行中返回其他列的值。

需要注意的一点是:如果有多行具有相同的最大值在 a,除非TDengine对该情形给出确定性的并列排序规则,请不要假设将返回哪一行的 b 值。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章