在SQL(PSQL)中,如何按行分区进行分组(如何进行嵌套分组)?

时间:2018-05-24 16:49:12

标签: sql postgresql statistics psql

问题的措辞需要改进,我不确定如何准确描述它。

根据表格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单独使用则会压缩结果为每个名称一行。

1 个答案:

答案 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;