azure-cosmosdb - Azure Cosmos DB 如何按一系列值进行分组
问题描述
我的 Cosmos 数据库中有一堆文档,它们的数值范围可以很大。我正在尝试按查询执行分组,将这些值分组在一个范围内,然后提供每个范围内的数量。
例如,假设我有 10 个文档,其值如下:
1, 1, 3, 4, 6, 7, 12, 28, 70, 120
我希望能够对这些进行分组,以便计算:“小于 10”、“在 10 到 100 之间”和“超过 100”。我试过写类似下面的东西,但它没有奏效:
SELECT COUNT(c.TestValue > 10),
COUNT(c.TestValue <= 10 AND c.TestValue < 100),
COUNT(c.TestValue <= 100)
FROM c
GROUP BY c.TestValue > 10,
c.TestValue <= 10 AND c.TestValue < 100,
c.TestValue <= 100
显然这行不通,但我正在努力研究如何编写 SQL 来完成这项工作。我一直在通过运行良好的查询为其他一些组执行此操作:
SELECT TestStringValue as groupedKey,
COUNT(1) as groupedValue
FROM c
GROUP BY TestStringValue
这一直在返回结果,如下所示:
{
"groupedKey": "Apples",
"groupedValue": 10
}
...
在理想的世界中,我希望范围结果如下所示,但我认为这是不可能的:
{
"groupedKey": "Less than 10",
"groupedValue": 6
},
{
"groupedKey": "Between 10 and 100",
"groupedValue": 3
},
{
"groupedKey": "More than 100",
"groupedValue": 3
}
解决方案
您可以将三元运算符与SUM
函数结合使用来计算表达式:
SELECT
SUM(c.number < 10 ? 1 : 0) AS lt10,
SUM(c.number >= 10 ? 1 : 0) AS ge10
FROM c
如果您有一个WHERE
将范围限制为几个文档的表达式,它会工作得很好,但由于它无法利用索引,因此很快就会在更大的集合上使用大量的 RU。
那就是说;Cosmos 的优势在于它的并行处理。您可以轻松地将您的请求分成三个单独的请求,这些请求几乎不使用任何请求单元并将结果合并在一起。
推荐阅读
- mern - 无法读取未定义的属性“jwtoken”
- reactjs - 脚本更改时自动刷新当前页面
- flutter - 如何在 Flutter 中设置宽度响应?
- xero-api - Xero Payroll API:通过 API 端点触发入职流程?
- c# - 如何在控制台应用程序上使用纯 DI 实现控制反转?(不使用 IoC 容器)
- java - JsonProcessingException 中的 catch 块中的 SonarQube 错误
- javascript - Discord.JS - 将目录中的所有文件作为一条消息列出
- python - Geopandas to_sql 在 mysql 中将几何列显示为文本
- xcode - XCode TestPlan:从命令行指定要使用的配置
- python - 使用 pytube.caption 时发现“开始”的关键错误