Count Aggregate Dot Count语法(.count)

Dan*_*iel 7 sql postgresql count aggregate-functions

因此,当我意外地提到我的CTE中不存在的"计数"列时,我遇到了我认为是一个奇怪的错误.Postgres正在寻找GROUP BY子句,即使我不认为我在做聚合.多一点玩,看起来table.count相当于一个计数星函数.考虑以下:

SELECT
    c.clinic_id,
    c.count,
    count(*) as count_star
FROM clinic_member c
GROUP BY 
 c.clinic_id
ORDER BY clinic_id;
Run Code Online (Sandbox Code Playgroud)

这将在我的数据集中生成如下所示的结果:

在此输入图像描述

有兴趣了解Postgres的实际语法规则是什么,我尝试在文档中搜索对此语法的引用,但无法找到任何内容; 只有很多计数(*)的文档.任何人都可以解释这是否是有效的SQL以及是否还有其他聚合函数也可以类似地调用?Postgres文档的链接如果存在则会很棒.

注意.这是Postgres 9.5.9

a_h*_*ame 9

它是有效的Postgres语法,因为在Postgres中,可以用两种不同的方式调用具有与表类型匹配的单个参数的函数:

假设一个表名foo和一个some_function用单个参数类型命名的函数,foo则以下内容:

select some_function(f)
from foo f;
Run Code Online (Sandbox Code Playgroud)

相当于

select f.some_function
from foo f;
Run Code Online (Sandbox Code Playgroud)

别名实际上不是必需的:

select foo.some_function
from foo;
Run Code Online (Sandbox Code Playgroud)

这是Postgres的"面向对象"结构的结果.

count() 可以采取任何参数 - 包括行引用(=记录)因此

select count(f)
from foo f;
Run Code Online (Sandbox Code Playgroud)

相当于

select f.count
from foo f;
Run Code Online (Sandbox Code Playgroud)

这在手册中有关函数调用的章节中有说明:

可以选择使用字段选择语法调用采用复合类型的单个参数的函数,相反,可以用函数样式编写字段选择.也就是说,符号col(table)和table.col是可以互换的.此行为不是SQL标准,但在PostgreSQL中提供,因为它允许使用函数来模拟"计算字段".有关更多信息,请参见第8.16.5节.

  • 哇.很好的答案. (2认同)