0

假设 SQL 数据库中的表结构如下:

Att1   |   Att2   |   Att3   |  Cnt

我想了解给定 Att1 的所有 Att2 组合的 Att3 重叠。例如,如果我有下表:

123   |   456    |   abc    |  1
123   |   456    |   efg    |  1
123   |   456    |   hij    |  1
123   |   456    |   klm    |  1
123   |   456    |   nop    |  1
123   |   789    |   efg    |  1
123   |   789    |   abc    |  1
123   |   789    |   xyz    |  1
123   |   789    |   nop    |  1
345   |   456    |   abc    |  1
345   |   456    |   efg    |  1
345   |   789    |   abc    |  1
345   |   999    |   efg    |  1

我会生成以下输出:

123   |   456    |   456    |  1.0
123   |   456    |   789    |  .6
123   |   789    |   456    |  .75
123   |   789    |   789    |  1.0
345   |   456    |   456    |  1.0
345   |   456    |   789    |  .5
345   |   456    |   999    |  .5
345   |   789    |   456    |  1.0
345   |   789    |   789    |  1.0 
345   |   789    |   999    |  0
345   |   999    |   456    |  1.0
345   |   999    |   789    |  0  
345   |   999    |   999    |  1.0

我知道这可能不是使用 SQL 完成的最佳方式,因此我很高兴听到其他替代方案,但 SQL 是我目前拥有可用数据的地方。

4

1 回答 1

6

您可以使用聚合的一些简单技巧来做到这一点:

SELECT t1.att1, t1.att2, t2.att2 as att2_other, 
       SUM(CASE WHEN t2.att3 = t1.att3 THEN 1.0 ELSE 0 END)/COUNT(DISTINCT t1.att3) as Cnt
FROM table_name t1
JOIN table_name t2
  ON t1.att1 = t2.att1
GROUP BY t1.att1, t1.att2, t2.att2

在这里工作 sqlfiddle

于 2013-01-08T20:40:21.207 回答