postgresql - 计算每个用户(唯一值)的包(行值)组合

标签 postgresql

考虑以下几点:

customer, package
a, pack1
a, pack2
b, pack1
c, pack1
c, pack2
d, pack3
d, pack2
d, pack1
e, pack1
e, pack3
f, pack1
f, pack2
f, pack3

我需要的输出是,有多少唯一客户拥有特定的套餐组合:

 pack1, 1 
(pack1, pack2), 2
(pack1, pack2, pack3), 2
(pack1, pack3), 1 

当我将表格导出到电子表格(或使用 GNU datamash)并制作数据透视表并对其进行一些处理时,我可以得到我需要的东西,但我需要手工计数。所以我一直认为这应该更简单(无需将数据导出到数据透视表)。

感谢任何指点(已经晚了)。

有一个 SQLFiddle:http://sqlfiddle.com/#!9/7bb98/1

最佳答案

您需要将每个客户的包裹连接成一个字符串(按包裹排序),然后您可以按该连接字符串进行计数:

对于 Postgres:

select packs, count(*)
from (
    select cust, string_agg(package,',' order by package) packs
    from  Table1
    group by cust
    ) p
group by packs    
;

结果

|             packs | count |
|-------------------|-------|
|       pack1,pack3 |     1 |
|       pack1,pack2 |     2 |
| pack1,pack2,pack3 |     2 |
|             pack1 |     1 |

SQLFiddle Demo

关于postgresql - 计算每个用户(唯一值)的包(行值)组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480966/

相关文章:

PostgreSQL 函数返回一个表而不指定表中的每个字段

postgresql - 将 postgresql 数组导入配置单元

python - Django的manage.py迁移错误

sql - 如何在 PostgreSQL 中创建包含(纬度、经度)和其他数据类型列的复合索引?

sql - 使用窗口函数和过滤器 PostgreSQL 按时间条件计算移动和/计数

sql - 按案例排序,NULL 不是第一个也不是最后一个

sql - PSQL : Invalid input syntax for integer on COPY

postgresql - 将 postgres_ext(或 Rails 4)数组与关联结合起来

postgresql - 如何在 PostgreSQL 中修剪文本数组?

java - SQL 不同的多列