【问题标题】:How to aggregate information from indefinite number of groups如何从不定数量的组中聚合信息
【发布时间】:2019-11-20 05:09:51
【问题描述】:

如何在 TSQL 中聚合来自不定数量组的信息? 例如。我们有一个包含 2 列的表 - 客户和区域。

Clients Regions
client1 45
client1 45
client1 45
client1 45
client1 43
client1 42
client1 41
client2 45
client2 45
client3 43
client3 43
client3 41
client3 41
client3 41
client3 41

每个客户端都可以有任意数量的区域。

在下面的示例中:client1 有 4 组区域,第 2 - 1 组,第 3 - 2 组。

我想计算每个客户的 gini 杂质,即计算 - 客户区域的差异有多大。

为此,我想对每个客户应用以下公式:

1 - ((% of region1 among all the regions in the client) ^ 2 + 
     (% of region2 among all the regions in the client) ^ 2 + 
   … (% of regionN among all the regions in the client) ^ 2)

但是区域的数量是不确定的(每个客户端可能不同)。

这应该是计算出来的:

client1 = 1 - ((4 / 7 ) ^ 2 + (1 / 7 ) ^ 2 + (1 / 7 ) ^ 2  + (1 / 7 ) ^ 2)
client2 = 1 - ((2 / 2 ) ^ 2)
client3 = 1 - ((2 / 6 ) ^ 2 +  (4 / 6 ) ^ 2)

这是理想的输出:

Clients Impurity
client1 61%
client2 0%
client3 44%

您能提示我解决问题的方法吗?

【问题讨论】:

  • 一步一步来。编写查询以获取每个客户的计数。编写查询以获取每个客户端和区域的计数。将两者结合起来,以获得百分比。汇总,因此您可以总结百分比的幂。
  • 根据示例数据,预期的输出是什么?谢谢。
  • 将预期输出添加到主题

标签: sql sql-server tsql gini


【解决方案1】:

我认为该公式可以表示为一组:

WITH cte AS (
    SELECT Clients
         , CAST(COUNT(*) AS DECIMAL(10, 0)) / SUM(COUNT(*)) OVER(PARTITION BY Clients) AS tmp
    FROM t
    GROUP BY Clients, Regions
)
SELECT Clients
     , 100 * (1 - SUM(tmp * tmp)) AS GI
FROM cte
GROUP BY Clients

db<>fiddle 似乎与预期的输出匹配。

【讨论】:

  • 语法 1. * count 看起来很奇怪 - 你不是要使用减号吗?
  • 没有。 1. 将强制将所有 COUNT(*) 转换为 DECIMAL。否则 4 / 7 将是 0 而不是 0.57。
  • 肯定在其中一个操作数上使用 CAST 可以使代码更具自我记录/可维护性..
  • Salman 和所有参与讨论的人,非常感谢。您的代码完美运行。
【解决方案2】:

以下是我的处理方法:

  • 在子子查询中,执行count(*) as cnt ... group by clients, regions
  • 在子查询中,执行 cast(cnt as float)/sum(cnt) over(partition by clients) as pcnt 并将其平方
  • 在外部查询中执行1 - sum(pcnt) ... group by clients

有一些方法可以压缩它以不使用 2 个子查询,但它们可能不会使其更具可读性或易于理解。我并不完全清楚您是指百分比(100 分)还是比率(1 分),所以您可能需要在适当的位置添加 *100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多