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

2 回答 2

4

假设flag为 0 或 1,这应该有效:

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

如果flag可以采用其他值,CASE则无论如何IF()都应该有助于工作。SUM

于 2009-05-31T23:55:08.537 回答
4

select groupid , AVG(cast(flag as float)) as ratio from tableA group by groupid

于 2009-06-01T17:19:45.707 回答