在 Cosmos 中选择每个 GROUP BY 中的第一项

问题描述 投票:0回答:1

我有以下 json 结构

  json1
  {
   name : Raju
   Location : bangloor
   _ts: 1705505722
  }
  json2
  {
   name : Ramu
   Location : bangloor
   _ts: 1705505725
  }
  json3
  {
   name : Ram
   Location : bangloor
   _ts: 1705505729
  }
  json4
  {
   name : sam
   Location : kerala
   _ts: 1705505830
  }
  json5
  {
   name : samual
   Location : kerala
   _ts: 1705505835
  }
  json6
  {
   name : ramya
   Location : kerala
   _ts: 1705505838
  }

我需要按位置对每个项目进行分组,并从每个组中获取最新的 json(基于具有完整 json 内容的创建日期)

预期输出:

[{
   name : Ram
   Location : bangloor
   _ts: 1705505729
 },
 {
  name : ramya
  Location : kerala
  _ts: 1705505838
}]

我已尝试以下查询,但它不起作用

SELECT *
from c
JOIN (
 SELECT c1.Location, MAX(c1._ts) AS MaxTimestamp
 FROM c c1
 GROUP BY c1.Location) maxTimestamps
WHERE c.Location = maxTimestamps.Location 
AND c._ts = maxTimestamps.maxTimestamp

我认为 Cosmos DB 中不直接支持非相关子查询。我们可以通过自连接在单个查询中完成此操作吗?

azure azure-cosmosdb azure-cosmosdb-sqlapi
1个回答
0
投票

正如 Martin Smith 在评论中建议的那样,您可以

concatenate
timestamp
一起定位,下面的答案中使用了相同的方法:

SELECT c.Location,
MAX(CONCAT(TimestampToDateTime(c._ts*1000),' ',c.name)) 
AS timeName 
FROM c WHERE c.Location IN ('kerala', 'bangloor') GROUP  BY c.Location
上面的查询中使用

CONCAT()
函数将位置与相关时间戳连接起来,
MAX()
函数用于从连接值中检索最大值。

输出:

[
    {
        "Location": "kerala",
        "timeName": "2024-01-22T05:22:10.0000000Z ramya"
    },
    {
        "Location": "bangloor",
        "timeName": "2024-01-22T05:19:07.0000000Z Ram"
    }
]
© www.soinside.com 2019 - 2024. All rights reserved.