透视列 Postgresql

Posted

技术标签:

【中文标题】透视列 Postgresql【英文标题】:Pivoting column Postgresql 【发布时间】:2016-09-26 00:48:34 【问题描述】:

我有一张如下所示的表格:

username     item_name   total_units_per_username    
abc@gma.com   laptop      2
abc@gma.com   watch       2
xyz@gma.com  phone        3
xyz@gma.com  laptop       3
xyz@gma.com  watch        3

我想要一个如下所示的表格:

total_units_per_username    item_name               frequency
3                        phone, laptop, watch      1

基本上我想旋转 item_name 列,连接 total_units_per_username 上的所有值,并计算出现的频率。我正在使用雪花。

谢谢!

【问题讨论】:

你的五行是怎么变成单行的? 我本质上是在寻找类似于 LEAD 函数的东西,但不限于我分区的下一行。此外,由于 total_units_per_username 会随着时间的推移而增长,这不是一个长期的解决方案。 【参考方案1】:

我认为你想要两个聚合:

select numitems, items, count(*) as freq
from (select username,
             string_agg(item_name order by item_name, ', ') as items,
             count(*) as numitems
      from t
      group by username
     ) t
group by numitems, items;

编辑:

您也可以使用array_agg()

select numitems, items, count(*) as freq
from (select username,
             array_agg(item_name order by item_name) as items,
             count(*) as numitems
      from t
      group by username
     ) t
group by numitems, items;

【讨论】:

这就是我最初尝试使用的!但我的服务器不支持 string_agg。 @Julia 。 . .您必须使用旧版本的 Postgres。从 2010 年发布的 9.0 开始支持string_agg()。无论如何,您都可以使用array_agg()

以上是关于透视列 Postgresql的主要内容,如果未能解决你的问题,请参考以下文章

透视取消透视附加列

从行创建/透视列并创建透视后,我想在 SQL 中新创建的列中添加不同列的值

透视动态列[重复]

Excle数据透视表如何在数据透视表顶部显示列总计数据

Postgresqlpostgresql9.3.9版本基于流复制方式双机热备方案

别名数据透视列