首页 > 解决方案 > 特定列的所有值组合的频率

问题描述

我在 SQL Server 2012 中有一个数据集,其中包含 id 和 value 列,如下所示:

[id]  [value]
--------------
A        15
A        11
A        11
B        13
B        15
B        12
C        12
C        13
D        13  
D        12

我的目标是获取 [value] 的所有组合的频率计数,但有两个警告:

  1. 顺序无所谓,所以 [11,12,15] 不与 [12,11,15] 分开计算

  2. 重复值是分开计算的,所以[11,11,12,15]和[11,12,15]分开计算

  3. 我对任何长度的所有组合都感兴趣(不仅仅是对)

所以结果看起来像:

[combo]   [frequency]
---------------------
11,11,15  1
12,13,15  1
12,13     2

我在这里看到了涉及递归的答案,这些答案回答了类似的问题,但顺序很重要,而这里的答案涉及到产生成对组合的自联接。这些接近但我不太确定如何适应我的特定需求。

标签: sqlsql-server

解决方案


您可以使用string_agg()

select vals, count(*) as frequency
from (select string_agg(value, ',') within group (order by value) as vals, id
      from t
      group by id
     ) i
group by vals;

SQL Server 2012 不支持string_agg(),但您可以使用 XML hack:

select vals, count(*) as frequency
from (select id,
             stuff( (select concat(',', value)
                     from t t2
                     where t2.id = i.id
                     for xml path ('')
                    ), 1, 1, ''
                  ) as vals
      from (select distinct id from t) i
     ) i
group by vals;

推荐阅读