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
它是有效的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节.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |