Azure Cosmos DB 如何按一系列值进行分组

Posted

技术标签:

【中文标题】Azure Cosmos DB 如何按一系列值进行分组【英文标题】:Azure Cosmos DB how to group by a range of values 【发布时间】:2021-12-16 22:52:28 【问题描述】:

我的 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

【问题讨论】:

没有直接查询来创建这样的聚合组(带范围)。您需要在 Cosmos DB 之外执行此操作,例如返回每个离散 groupedKey 的分组值,然后自己聚合离散值(或使用 Spark 或 Stream Analytics 等流服务,或者可能是存储过程,如果所有数据都驻留在单个分区中)。 【参考方案1】:

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

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

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

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

【讨论】:

能否提供并行处理部分的链接?谢谢! 不是完全相同的引用,而是:Azure Cosmos DB's design lets you scale to massive request volumes in the order of trillions of requests per day.docs.microsoft.com/en-us/azure/cosmos-db/use-cases

以上是关于Azure Cosmos DB 如何按一系列值进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure Cosmos DB 的一个查询中选择多个聚合值

如何使用 LINQ 针对 Azure Cosmos Document DB SQL API 有效地进行动态查询?

如何在 Python 中从 Azure 函数调用 Cosmos DB 存储过程?

如何从 Service Fabric Mesh 连接到 Azure Cosmos DB

通过 MongoAPI 对 Azure Cosmos DB 进行聚合查询时出现意外错误

Azure Cosmos DB 请求存储过程的分区键