我想計算多個集合的基尼係數,其中包含一個包含值和集合的兩列表(這裏稱爲#cits
) -ID。我一直在試驗不同的基尼係數計算,描述爲here (StackExchange query)和here (StackOverflow question with some good replies)。這兩個例子只計算一個表的一個係數,而我想用GROUP BY
子句來計算。具有OVER語句的複雜GROUP BY的SQL語法:計算多個集合的基尼係數
#cits
表包含兩列,分別爲c
和cid
,分別爲值和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之間。正如評論中所述,我更喜歡單一查詢解決方案,但它不是主要問題。
我認爲你正在尋找row_number,這是你的「分組」的分區部分。 'row_number()over(由c分區,cid按c asc,cid排序)' – scsimon
看起來你是對的 - 我一直在尋找分區,因爲在這裏問這個問題,並認爲我接近解決方案 - 儘管它要求我使用兩個查詢...我想要一個,爲它的美麗;) – ipoga
你可以有一個包裹在CTE中,需要我告訴你嗎? – scsimon