#cits
我想计算多个集合的基尼系数,这些集合包含在一个包含值和集合 ID的两列表(此处称为)中。我一直在尝试不同的基尼系数计算,在此处(StackExchange 查询)和此处(StackOverflow question with some good reply)进行了描述。这两个例子都只计算一个表的一个系数,而我想用一个GROUP BY
子句来做。
该#cits
表包含两列,c
和cid
,分别是 value 和 set-ID。
这是我目前的尝试(不完整):
select count(c) as numC,
sum(c) as totalC,
(select row_number() over(order by c asc, cid) id, c from #cits) as a
from #cits group by cid
当然,选择 numC 和 totalC 效果很好,但下一行让我头疼。我可以看到语法是错误的,但我不知道如何为row_number()
每个 cid 分配每个 c。
编辑:根据建议,我使用了partition
,如下所示:
select cid,sumC = sum(a.id * a.c)
into #srep
from (
select cid,row_number() over (partition by cid order by c asc) id,
c
from #cits
) as a
group by a.cluster_id1
select count(c) as numC,
sum(c) as totalC, b.sumC
into #gtmp
from #cits a
join #srep b
on a.cid = b.cid
group by a.cid,b.sumC
select
gini = 2 * sumC / (totalC * numC) - (numC - 1) / numC
from #gtmp
这几乎可以工作。我得到了一个结果,但它>1,这是出乎意料的,因为基尼系数应该在 0 和 1 之间。如评论中所述,我也更喜欢单查询解决方案,但它不是根本问题。