-1

#cits我想计算多个集合的基尼系数,这些集合包含在一个包含值和集合 ID的两列表(此处称为)中。我一直在尝试不同的基尼系数计算,在此处(StackExchange 查询)此处(StackOverflow question with some good reply)进行了描述。这两个例子都只计算一个表的一个系数,而我想用一个GROUP BY子句来做。

#cits表包含两列,ccid,分别是 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 之间。如评论中所述,我也更喜欢单查询解决方案,但它不是根本问题。

4

2 回答 2

1

您可以“分区”数据,以便为每个 ID 重新开始行编号......但我不确定这就是你所追求的......

我假设您希望在按其分组时显示 CID。

select count(c) as numC
     , sum(c) as totalC
     , row_number() over(partition by cID order by c asc) as a
     , cid 
from #cits group by cid

请注意,您不需要子查询。

是的,这不太可能。

输出

NumC TotalC A CID
24   383    1  1
15   232    1  2
于 2016-11-22T21:15:26.333 回答
0

如果我理解正确,您需要 cid 集中每个 C 的 numC 和 totalC ,以及该集中 c 的位置。这应该可以满足您的需求:

select
    rn.cid,
    rn.c,
    row_number() over (partition by rn.cid order by rn.c) as id,
    agg.numC,
    agg.totalC
from #cits rn
    left outer join
    (
        select
            cid,
            count(c) as numC,
            sum(c) as totalC
        from #cits
        group by cid
    ) agg
        on rn.cid = agg.cid
于 2016-11-22T21:18:09.527 回答