CosmosDb统计不同的元素

时间:2018-05-30 14:21:51

标签: sql azure azure-cosmosdb

是否有直接函数来计算CosmosDb查询中的不同元素?

这是默认计数:

SELECT value count(c.id) FROM c

并且不计数的不同作品:

SELECT distinct c.id FROM c

但是这会返回错误请求 - 语法错误:   <击> SELECT value count(distinct c.id) FROM c

countdistinct如何协同工作?

8 个答案:

答案 0 :(得分:4)

我知道这是一个旧线程。

但是,仅是为了使主题保持更新,当前(2020年7月),您可以对Cosmos DB表执行SELECT DISTINCT。但是,直接应用COUNT(DISTINCT ..)不会给出正确的结果。 因此,您需要使用基于子查询的方法来应用以下变通方法,以获取正确的非重复计数结果

SELECT COUNT(UniqueIDValues) AS UniqueCount
FROM (SELECT Id FROM c GROUP BY Id) AS UniqueIDValues

答案 1 :(得分:2)

与众不同的支持已在19th Oct 2018

上添加

以下查询工作正常

var C = function(address, abiJson){
    var _ = this;
    // add get method first:
    this.get = function( arg){ return Promise.resolve( arg)};
    this.updateData = Promise.all([
            _.get('x'),
            _.get('y')
        ]);
}
var c = new C();
c.updateData.then( values => console.log(values)); 

但是,它仍然无法计数。

用于计算不重复计数的变通方法是创建一个存储过程来执行不重复计数。基本上,它将查询并继续到最后并返回计数。

如果将类似的查询传递给下面的存储过程,则将获得不同的计数

SELECT distinct value c FROM c join p in c.products

该解决方法的问题在于,它可能会超过您收藏中的RU限制,并且不会成功。如果是这种情况,您可以在服务器端实现类似的代码,效果不是很好。

答案 2 :(得分:2)

我做了一些调查并找到了解决方案。为了获得不同结果的计数,您不能使用 count(1)。您需要使用 AS subqueryName “包装”子查询,然后使用 count(subqueryName) 如下所示:

select count(subqueryName) from (SELECT distinct r.x FROM r) as subqueryName

干杯!

答案 3 :(得分:1)

据我所知,目前,Cosmos DB不支持嵌套查询。

执行您想要的操作的唯一方法是将所有不同的ID作为查询结果返回,然后依靠它们。您可以直接在代码中或在存储过程的帮助下(在大量文档上应该更有效)。

答案 4 :(得分:1)

  

如何从SELECT COUNT(1)FROM(从c中选择不同的c.id)作为t? – Evaldas Buinauskas 18年5月30日在14:44

2019年5月15日,上面的注释适用于Where条件,我没有尝试使用Join,但请求确实返回了我要寻找的答案。

它正在处理CosmosDB中100个元素的限制。

如果我用Product做一个例子,应该是: SELECT COUNT(1) FROM (SELECT DISTINCT c.Id FROM c WHERE c.Brand = 'Coca')

答案 5 :(得分:0)

Azure cosmos DB作为SQL API的一部分,尚不支持distinct关键字。 实现此目的的最佳方法是使用带有自定义代码的存储过程。 请查找有关自定义存储过程here的更多详细信息。

似乎与众不同的关键字是开发不足。
请找到参考链接here

cosmos DB支持大多数聚合函数,请参阅受支持的聚合函数列表here

请在以下link中找到更多详细信息。

答案 6 :(得分:0)

Distinct关键字已得到正式支持并再次可用,

  

DISTINCT关键字可消除查询投影中的重复项。

选择不同的值f.lastName 来自家庭f

答案 7 :(得分:0)

要计算不同的元素,必须同时使用COUNT和GROUP BY。您不需要子查询,它可以在一个非常简单的查询中工作,例如本例,在该查询中,我们希望列出容器中所有家庭唯一的姓氏以及具有相同名称的家庭数:

select count(1) as numfam, f.lastName from f group by f.lastName

结果:

[
    {
        "numfam": 1
    },
    {
        "numfam": 1,
        "lastName": "Wakefield"
    },
    {
        "numfam": 2,
        "lastName": "Andersen"
    }
]

请注意,我的收藏集中只有一件商品没有姓氏,这是无模式的自由。

不幸的是,今天

目前尚无法在查询中添加“ order by”子句,例如以降序对最常用的名称进行排序。虽然声明的波斯菊团队正在对此进行操作,所以预期在某个时候可以使用此功能。您始终可以在客户代码中对结果进行排序。

如果您想知道特定名称的计数,可以使用此查询(可以使用参数化查询在一个地方输入名称):

select "Andersen" as lastName, count(1) as numfam from f  
where  f.lastName = "Andersen"

结果:

[
    {
        "lastName": "Andersen",
        "numfam": 2
    }
]