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

时间:2017-11-24 22:57:33

标签: 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

1 个答案:

答案 0 :(得分:0)

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

对于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