我在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,我需要类似的价值:
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)
...
问题:
即使上述有效,我将无法找到一种在多个列上使用聚合物的句法正确的方法,例如以下(坏)示例:
SELECT VALUE AVG(i.Body.Temp) as Temp, VALUE AVG(i.Body.Hum) as Hum, ...
...
...
因此,这是可以用Azure cosmosdb nosql langauge来实现的?
thanks @martin为您的见解。是的,@laszlo我在环境中尝试过,当数据通过查询中使用
StringToNumber
函数从字符串转换为数字时,它可以成功地工作。我尝试使用以下查询,它使用
stringToNUmber
string
转换为
number
。另外,使用AVG()
计算该特定小时的每个数字字段的averagity。
SELECT
datetimepart("hh", i.Body.TimeStamp) AS hh,
AVG(StringToNumber(i.Body.Temp)) AS Temp,
AVG(StringToNumber(i.Body.Hum)) AS Hum,
AVG(StringToNumber(i.Body.Baro)) AS Baro,
AVG(StringToNumber(i.Body.BaroSLP)) AS BaroSLP,
AVG(StringToNumber(i.Body.Alt)) AS Alt,
AVG(StringToNumber(i.Body.SBattery)) AS SBattery,
MAX(i.Body.TimeStamp) AS TimeStamp,
COUNT(1) AS Count
FROM iothub i
GROUP BY datetimepart("hh", i.Body.TimeStamp)
输出:
[
{
"hh": 17,
"Temp": 6.1,
"Hum": 75.65,
"Baro": 937.15,
"BaroSLP": 1011.1500000000001,
"Alt": 668.75,
"SBattery": 3747.75,
"TimeStamp": "2025-03-15T17:50:30Z",
"Count": 2
},
{
"hh": 16,
"Temp": 5.016666666666667,
"Hum": 76.91666666666667,
"Baro": 936.1233333333333,
"BaroSLP": 1010.9499999999999,
"Alt": 666.9833333333333,
"SBattery": 3750.1666666666665,
"TimeStamp": "2025-03-15T16:55:20Z",
"Count": 3
}
]