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