2016-11-22 29 views
-1

我想計算多個集合的基尼係數,其中包含一個包含值和集合的兩列表(這裏稱爲#cits) -ID。我一直在試驗不同的基尼係數計算,描述爲here (StackExchange query)here (StackOverflow question with some good replies)。這兩個例子只計算一個表的一個係數,而我想用GROUP BY子句來計算。具有OVER語句的複雜GROUP BY的SQL語法:計算多個集合的基尼係數

#cits表包含兩列,分別爲ccid,分別爲值和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效果很好,當然,但下一行讓我頭疼。我可以看到語法錯誤,但我無法弄清楚如何爲每個cid分配row_number()

編輯:根據建議 ,我用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之間。正如評論中所述,我更喜歡單一查詢解決方案,但它不是主要問題。

+1

我認爲你正在尋找row_number,這是你的「分組」的分區部分。 'row_number()over(由c分區,cid按c asc,cid排序)' – scsimon

+0

看起來你是對的 - 我一直在尋找分區,因爲在這裏問這個問題,並認爲我接近解決方案 - 儘管它要求我使用兩個查詢...我想要一個,爲它的美麗;) – ipoga

+1

你可以有一個包裹在CTE中,需要我告訴你嗎? – scsimon

回答

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 
+0

這對於走上正確的軌道非常有幫助,請參閱我的編輯。 – ipoga

0

如果我理解正確的話,你需要NUMC和totalC用於在CID集中的每個C,以及與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 
+0

請注意,我沒有任何數據可以執行此操作,因此可能需要調整 – DForck42