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 如何按一系列值进行分组的主要内容,如果未能解决你的问题,请参考以下文章