问题的措辞需要改进,我不确定如何准确描述它。
根据表格foo
,计算每个人可以说的语言数量,按格式分组。例如:
name | format | language
------+----------+------------
abe | compiled | golang
abe | compiled | c
abe | scripted | javascript
jon | scripted | ruby
jon | scripted | javascript
wut | spoken | english
(6 rows)
结果:
name | format | count
------+----------+------------
abe | compiled | 2
abe | scripted | 1
jon | scripted | 2
wut | spoken | 1
可以使用以下方式创建示例数据:
create table foo
(
name varchar(40) not null,
format varchar(40) not null,
language varchar(40) not null
);
insert into foo
values
( 'abe', 'compiled', 'golang' ),
( 'abe', 'compiled', 'c' ),
( 'abe', 'scripted', 'javascript' ),
( 'jon', 'scripted', 'ruby' ),
( 'jon', 'scripted', 'javascript' ),
( 'wut', 'spoken', 'english' )
;
我尝试过使用窗口函数count(*) over (partition by format)
,但它不会压缩行,它需要一个名称的嵌套窗口,然后是格式,而count(*) ... group by name
单独使用则会压缩结果为每个名称一行。
答案 0 :(得分:1)
使用group by
子句:
select name, format, count(*)
from foo
group by name, format;
但是,如果您想使用 window 功能,那么您也可以这样做:
select distinct name, format,
count(*) over (partition by name, format)
from foo f;