You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure CosmosDB NoSQL多列聚合分组查询实现方法问询

Azure CosmosDB NoSQL多列聚合分组查询实现

问题场景

我的Azure CosmosDB中存储的气象传感器测量文档格式如下:

"Body": {
    "Type": "Telemetry",
    "Temp": 4.43,
    "Hum": 77.65,
    "Baro": 935.77,
    "BaroSLP": 1010.90,
    "Alt": 666.05,
    "SBattery": 3751.00,
    "GBattery": 4466,
    "RSSI": -81,
    "Version": 8,
    "TimeStamp": "2025-03-15T16:11:35Z"
}

需求:按小时对这些测量数值进行平均聚合查询。

我尝试了常规SQL风格的查询,但无法运行:

SELECT AVG(i.Body.Temp) as Temp, AVG(i.Body.Hum) as Hum, AVG(i.Body.Baro) as Baro, AVG(i.Body.BaroSLP) as BaroSLP, AVG(i.Body.Alt) as Alt, AVG(i.Body.SBattery) as Battery, Max(i.Body.TimeStamp) as Time
FROM iothub i
WHERE i.partitionKey = @key and i.Body.TimeStamp >= @fromTime and i.Body.TimeStamp <= @toTime
group by datetimepart("hh", i.Body.TimeStamp)

我知道使用AVG聚合函数需要配合VALUE关键字,单列聚合的查询可以正常运行:

SELECT VALUE AVG(i.Body.Temp)
FROM iothub i
WHERE i.partitionKey = @key and i.Body.TimeStamp >= @fromTime and i.Body.TimeStamp <= @toTime
group by datetimepart("hh", i.Body.TimeStamp)

但我不知道多列聚合的正确语法(错误示例如下),想确认Azure CosmosDB NoSQL是否支持多列聚合分组查询?

SELECT VALUE AVG(i.Body.Temp) as Temp, VALUE AVG(i.Body.Hum) as Hum, ...
...
...

解决方法

Azure CosmosDB NoSQL完全支持多列聚合分组查询,问题出在对VALUE关键字的使用理解上。VALUE用于直接返回聚合结果的原始值,而非带属性名的对象,因此不能给每个聚合函数单独添加VALUE。

正确写法是将所有聚合字段包裹在一个对象中,无需给每个AVG加VALUE,同时建议将分组的小时值也返回,方便对应时段查看:

SELECT 
    datetimepart("hh", i.Body.TimeStamp) as Hour,
    AVG(i.Body.Temp) as Temp,
    AVG(i.Body.Hum) as Hum,
    AVG(i.Body.Baro) as Baro,
    AVG(i.Body.BaroSLP) as BaroSLP,
    AVG(i.Body.Alt) as Alt,
    AVG(i.Body.SBattery) as Battery,
    MAX(i.Body.TimeStamp) as LatestTime
FROM iothub i
WHERE 
    i.partitionKey = @key 
    and i.Body.TimeStamp >= @fromTime 
    and i.Body.TimeStamp <= @toTime
GROUP BY datetimepart("hh", i.Body.TimeStamp)

关键说明

  • VALUE仅适用于单列聚合场景,多列聚合时直接构造返回对象即可。
  • 包含分组的Hour字段,能明确每个聚合结果对应的时段。
  • 合理设置WHERE子句的过滤条件,避免扫描过多数据影响性能。

内容的提问来源于stack exchange,提问作者László Frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:53:20