Count Aggregate Dot Count语法(.count)

时间:2017-11-10 19:20:52

标签: 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;

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

enter image description here

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

请注意。这是Postgres 9.5.9

1 个答案:

答案 0 :(得分:9)

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

假设一个表名foo和一个名为some_function的函数,其中一个参数类型为foo,则表示以下内容:

select some_function(f)
from foo f;

相当于

select f.some_function
from foo f;

实际上没有必要使用别名:

select foo.some_function
from foo;

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

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

select count(f)
from foo f;

相当于

select f.count
from foo f;

这在手册中有关Function Calls的章节中有记录:

  

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