如何根据 ComosDb 中的聚合函数结果对查询结果进行排序?

Posted

技术标签:

【中文标题】如何根据 ComosDb 中的聚合函数结果对查询结果进行排序?【英文标题】:How to order results of a query by the results of an aggregate function in ComosDb? 【发布时间】:2020-03-17 07:00:06 【问题描述】:

我使用 Cosmos Db,我需要按 COUNT 的结果对结果进行排序。

我更喜欢直接在 Cosmosdb 的查询输出中对结果进行排序,而不是每次自己对结果进行排序(或为其创建服务)。

在 Azure 的文档资源管理器中,我对 AggregatedEvent 集合执行以下请求:

SELECT * FROM (
    SELECT COUNT(1) AS AlarmCount, a.AlarmType FROM AggregatedEvent a
    WHERE a.AlarmType != null and a.Prom > 0
    GROUP BY a.AlarmType ) AS g
ORDER BY g.AlarmCount

它会导致以下错误消息:

无法解析标识符“AlarmCount”。

如果我使用另一个属性来排序 g.AlarmType,一个存在于文档中的属性,则执行排序。

仅当您有办法使用 CosmosDb 归档订购时,请添加答案。

【问题讨论】:

a.AlarmType != null 应该是 a.AlarmType IS NOT NULL 你确定你说的是 CosmosDB SQL 而不是 TransactSQL for SQL Server 吗? 我说的是一般的 SQL。 ( 标签表示“对带有 SQL 标记的问题的答案应使用 ISO/IEC 标准 SQL。”)CosmosDB 在这里的工作方式是否有所不同? 是的,看来 IEC 标准 SQL 'IS NOT NULL' 不符合 Microsoft SQL。 截至 2020 年 5 月,此查询返回一个更具描述性的错误“ORDER BY 项目表达式无法映射到文档路径”,但仍然不起作用。 【参考方案1】:

截至 2021 年 10 月,此功能仍不受支持。 Microsoft 的文档在这里定义了限制:https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-group-by

GROUP BY 子句不允许以下任何一项:

别名属性或别名系统函数(在 SELECT 子句中仍然允许别名) 子查询 聚合系统函数(仅允许在 SELECT 子句中使用)

【讨论】:

【参考方案2】:

我认为您可以通过在查询中使用 order by 来实现结果。如下所示。

SELECT * FROM (
   SELECT COUNT(1) AS AlarmCount, a.AlarmType FROM AggregatedEvent a
   WHERE a.AlarmType != null and a.Prom > 0
   GROUP BY a.AlarmType ORDER BY COUNT(1) ) AS g

SELECT COUNT(1) AS AlarmCount, a.AlarmType FROM AggregatedEvent a
   WHERE a.AlarmType != null and a.Prom > 0
   GROUP BY a.AlarmType ORDER BY COUNT(1)

但是 cosmos db 更喜欢查询中每个条件的别名,因此您得到的错误。

【讨论】:

不,我在尝试嵌套查询之前尝试过这个,错误是:存在 GROUP BY 时不支持“ORDER BY”。

以上是关于如何根据 ComosDb 中的聚合函数结果对查询结果进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

26《MySQL 教程》聚合函数(聚合函数 MIN、MAX)

您的查询不包含表达式“未结金额”作为聚合函数的一部分 - MS Access

如何对具有聚合函数的 Oracle 查询进行分组

为啥sql查询语句中的count(*)等聚合函数可以放在having后面,而不能放在where后面?

图解 SQL 执行顺序,通俗易懂!

我要用oracle根据我截取到的年龄分组,查询显示其它字段,但是不用max(),sum()等聚合函数