-1

#cits値とセット ID を含む2 列のテーブル (ここでは と呼ばれる) に含まれる、いくつかのセットのジニ係数を計算したいと考えています。ここ (StackExchange クエリ)ここ (StackOverflow の質問といくつかの適切な回答)で説明されている、さまざまなジニ係数の計算を試しています。GROUP BY両方の例では、1 つのテーブルに対して 1 つの係数のみを計算しますが、節を使用して計算したいと考えています。

テーブルには との#cits2 つの列がcありcid、それぞれ値とセット 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()構文が間違っていることはわかりますが、 per c per cidを割り当てる方法がわかりません。

編集:提案に基づいて、次の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

これはほとんど機能します。結果は得られますが、ジニ係数は 0 から 1 の間である必要があるため、予想外の >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 に答える