2009-05-31 43 views
2

我想計算符合特定條件的組中項目的比例。我已經解決了這個問題,但很想知道我的解決方案是否是最優的,因爲查詢在我的大型(10m +)數據集上花費了很長時間。每組匹配行的比例

這是我在最簡單的形式:

create table #tableA 
(
    id int IDENTITY(1,1), 
    groupid int, 
    flag bit, 
    CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED 
    (
     [id] ASC 
    ) 
) 

insert into #tableA (groupid,flag) values (1,0),(1,0),(1,1),(2,0),(2,1) 

select 
    a.groupid , 
    cast(totalCount as float)/count(*) as ratio 
from 
    #tableA a 
    join 
    (
     select 
      groupid, 
      COUNT(*) totalCount 
     from 
      #tableA 
     where 
      flag=1 
     group by 
      groupid 
    ) b on a.groupid=b.groupid 
group by 
    a.groupid, 
    b.totalCount 

drop table #tableA 

有沒有寫這個查詢更有效的方式?

回答

4

假設flag爲0或1,這應該工作:

select groupid , 
     cast(sum(flag) as float)/count(*) as ratio 
from tableA 
group by groupid 

如果flag可以採取其他值,一個CASEIF()應有助於使SUM工作反正。

+0

當然!謝謝 – spender 2009-06-01 00:12:24

+0

如果它按照你想要的方式工作,你應該標記這個接受的 – 2009-06-01 00:27:26

4

選擇GROUPID, AVG(澆鑄(標誌爲float))用作比 從表A 組由GROUPID