2009-05-31 11 views
2

Ich möchte das Verhältnis der Elemente in einer Gruppe, die bestimmte Kriterien erfüllen, aus der Gesamtzahl der Elemente in dieser Gruppe berechnen. Ich habe das bereits gelöst, bin aber gespannt, ob meine Lösung optimal ist, da die Abfrage problematisch lange Zeit über meinem großen (10m +) Datensatz dauert.Verhältnis der übereinstimmenden Zeilen pro Gruppe

Hier ist, was ich in seiner einfachsten Form haben:

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 

Gibt es eine effizientere Möglichkeit, diese Abfrage zu schreiben?

Antwort

4

Unter der Annahme, flag 0 oder 1 ist, dies sollte funktionieren:

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

Wenn flag andere Werte annehmen kann, sollte ein CASE oder IF() helfen sowieso SUM Arbeit zu machen.

+0

Natürlich! Danke – spender

+0

Wenn es so funktioniert, wie du willst, solltest du dieses Akzeptieren wahrscheinlich markieren –

+0

Ich teste noch und muss eventuell an die Frage vor dem Schließen anhängen – spender

4

wählen groupid, AVG (cast (Flag als float)) als Verhältnis von tableA Gruppe von groupid

+0

Wirklich, flag ist ein Null- oder Nicht-Null-Vergleich aus einer Join-Spalte, also kombiniert mit einer case-Anweisung, die 0 für null und 1 für nicht-null gibt (aus Alex Martellis Antwort), ist dies eine elegante Lösung. Vielen Dank. – spender

+0

Ich stimme zu, das ist sicherlich eine sehr elegante Lösung! Arbeitete auch gut für mich! Vielen Dank – samirahmed

Verwandte Themen