首页 > 解决方案 > 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
}

标签: azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


您可以将三元运算符与SUM函数结合使用来计算表达式:

SELECT 
    SUM(c.number < 10 ? 1 : 0) AS lt10,
    SUM(c.number >= 10 ? 1 : 0) AS ge10
FROM c

如果您有一个WHERE将范围限制为几个文档的表达式,它会工作得很好,但由于它无法利用索引,因此很快就会在更大的集合上使用大量的 RU。

那就是说;Cosmos 的优势在于它的并行处理。您可以轻松地将您的请求分成三个单独的请求,这些请求几乎不使用任何请求单元并将结果合并在一起。


推荐阅读