Соотношение совпадающих строк на группу - PullRequest
2 голосов
/ 01 июня 2009

Я бы хотел рассчитать соотношение элементов в группе, которые соответствуют определенным критериям, к общему количеству элементов в этой группе. Я уже решил эту проблему, но мне любопытно узнать, является ли мое решение оптимальным, так как запрос занимает проблематично много времени в моем большом (10 м +) наборе данных.

Вот что я имею в своей простейшей форме:

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

Есть ли более эффективный способ написать этот запрос?

Ответы [ 2 ]

4 голосов
/ 01 июня 2009

выберите groupid, AVG (приведение (пометить как float)) как отношение из таблицы А сгруппировать по groupid

4 голосов
/ 01 июня 2009

Если flag равно 0 или 1, это должно работать:

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

Если flag может принимать другие значения, CASE или IF() должны помочь заставить SUM работать в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...