【发布时间】:2020-09-09 06:53:10
【问题描述】:
我正在使用 Azure Cosmos DB SQL API 来尝试实现以下目标;
我们将设备数据存储在一个集合中,并且希望能够有效地检索每个设备序列的最新事件数据,而无需分别对每个设备进行 N 次查询。
SELECT *
FROM c
WHERE c.serial IN ('V55555555','synap-aim-g1') ORDER BY c.EventEnqueuedUtcTime DESC
我假设我需要使用 Group By - https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-group-by
任何帮助将不胜感激
粗略的数据示例:
[
{
"temperature": 25.22063251827873,
"humidity": 71.54208429695204,
"serial": "V55555555",
"testid": 1,
"location": {
"type": "Point",
"coordinates": [
30.843687,
-29.789895
]
},
"EventProcessedUtcTime": "2020-09-07T12:04:34.5861918Z",
"PartitionId": 0,
"EventEnqueuedUtcTime": "2020-09-07T12:04:34.4700000Z",
"IoTHub": {
"MessageId": null,
"CorrelationId": null,
"ConnectionDeviceId": "V55555555",
"ConnectionDeviceGenerationId": "637323979596346475",
"EnqueuedTime": "2020-09-07T12:04:34.0000000"
},
"Name": "admin",
"id": "6dac491e-1f28-450d-bf97-3a15a0efaad8",
"_rid": "i2UhAI7ofAo3AQAAAAAAAA==",
"_self": "dbs/i2UhAA==/colls/i2UhAI7ofAo=/docs/i2UhAI7ofAo3AQAAAAAAAA==/",
"_etag": "\"430131c1-0000-0100-0000-5f5621d80000\"",
"_attachments": "attachments/",
"_ts": 1599480280
}
]
更新: 因此,执行以下操作会返回正确的数据,但遗憾的是您只能返回组内的数据或聚合函数(即不能选择 *)
SELECT c.serial, MAX(c.EventProcessedUtcTime)
FROM c
WHERE c.serial IN ('V55555555','synap-aim-g1')
GROUP BY c.serial
[
{
"serial": "synap-aim-g1",
"$1": "2020-09-09T06:29:42.6812629Z"
},
{
"serial": "V55555555",
"$1": "2020-09-07T12:04:34.5861918Z"
}
]
【问题讨论】:
-
根据“每个设备序列的最新事件数据”,您的意思是说您可以拥有多个文档,比如说“V55555555”具有不同的“EventProcessedUtcTime”,我们需要选择其中最新的一个,并且每个设备都必须这样做吗?
-
这是正确的@AnuragSharma-MSFT,每个设备序列(分区)我们将拥有无限的文档。我想有效地获取最新的文档(按您正确说明的 IoT 中心时间)
-
恐怕没有直接的方法可以使用 cosmos db 中的查询来实现它。但是,您可以参考以下链接了解同一主题。如果您使用任何 sdk,这将有助于实现所需的功能:docs.microsoft.com/en-us/answers/questions/38454/index.html
-
好吧,我这么想。谢谢!
-
嗨@David,非常感谢 AnuragSharma-MSFT 的帮助!我们很高兴您解决了它。更新应该作为答案发布,我只是帮你发布。您可以接受它作为答案。这对其他社区成员可能是有益的。谢谢。
标签: sql group-by azure-cosmosdb azure-cosmosdb-sqlapi