2016-07-14 16 views
0

sagen, dass ich eine Tabelle mit den folgenden Informationen haben:Berechnung des Durchschnitts in distriubtion

Haltedauer als Anzahl der Tage zwischen Start & End berechnet Termine

ID Start_Date End_Date Reading Holding_Period 

    1  20140501  20160410 55  710 
    2  20150407  20151231 82  268 
    3  20160104  20160529 110  146 
    4  20140209  20160209 39  730 
    5  20131211  20151101 25  690 

Für diesen Datensatz, erhalte ich die Häufigkeitsverteilung und durchschnittliche Haltedauer (hp) unter Verwendung der folgenden.

select YEAR(enddate)*100 + MONTH(enddate) as salemonth 
,avg(hp) as hp 
,sum(reading_0_50) as reading_0_50 
,sum(reading_50_100) as reading_50_100 
,sum(reading_100_150) as reading_100_150 
from 
(
    select x.id 
    ,x.enddate as enddate 
    ,sum(x.hp) as hp 
    ,sum(x.reading_0_50) as reading_0_50 
    ,sum(x.reading_50_100) as reading_50_100 
    ,sum(x.reading_100_150) as reading_100_150 
    from 
    ( select id 
    ,hp 
    ,enddate 
    ,case when reading >= 0 and reading <= 50 THEN 1 ELSE 0 END as reading_0_50 
    ,case when reading > 50 and reading<= 100 THEN 1 ELSE 0 END as reading_50_100 
    ,case when reading > 100 and reading<= 150 THEN 1 ELSE 0 END as reading_100_150 
    from readings 
)x 
    group by x.id,x.enddate 
) p 
group by YEAR(enddate)*100 + MONTH(enddate) 

Das gibt mir die Ausgabe

salemonth hp reading_0_50 reading_50_100 reading_100_150 

201511 690 1     0    0 
201512 268 0     1    0 
201602 730 1     0    0 
201604 710 0     1    0 
201605 146 0     0    1 

jedoch der Durchschnitt HP ist über den Monat

Meine Frage lautet:. , wenn ich den durchschnittlichen HP-Wert mit dem Binned Bucket ermitteln soll, wie mache ich das in SQL?

Vielen Dank im Voraus für das Lesen.

+0

In Ihrer innersten Abfrage definieren Sie die Buckets nach Trefferanzahl. Definieren Sie die Buckets erneut, aber geben Sie stattdessen HP sonst 0 zurück. Dann AVG() sie in den nächsten Abfragen. – Malk

+0

Danke @Malk für die Antwort. Du meinst das Hinzufügen dieser Rechte:, Fall beim Lesen> = 0 und Lesen <= 50 THEN HP ELSE 0 END als hp_reading_0_50 , Fall beim Lesen> 50 und Lesen <= 100 THEN HP ELSE 0 END als hp_reading_50_100 , Fall beim Lesen> 100 und lesen <= 150 THEN HP ELSE 0 END als hp_reading_100_150. Ich habe das früher versucht, bekam nicht die richtigen Durchschnittswerte. Also frage mich, was ich falsch mache. – Bee

Antwort

0
select YEAR(enddate)*100 + MONTH(enddate) as salemonth 
,avg(hp) as hp 
,sum(reading_0_50_count) as reading_0_50 
,sum(reading_50_100_count) as reading_50_100 
,sum(reading_100_150_count) as reading_100_150 
,case when sum(reading_0_50_count) = 0 then 0 else sum(reading_0_50_total)/sum(reading_0_50_count) end as reading_0_50_avg 
,case when sum(reading_50_100_count) = 0 then 0 else sum(reading_50_100_total)/sum(reading_50_100_count) end as reading_50_100_avg 
,case when sum(reading_100_150_count) = 0 then 0 else sum(reading_100_150_total)/sum(reading_100_150_count) end as reading_100_150_avg 
from 
(
    select x.id 
    ,x.enddate as enddate 
    ,sum(x.hp) as hp 
    ,sum(x.reading_0_50_count) as reading_0_50_count 
    ,sum(x.reading_50_100_count) as reading_50_100_count 
    ,sum(x.reading_100_150_count) as reading_100_150_count 
    ,sum(x.reading_0_50_total) as reading_0_50_total 
    ,sum(x.reading_50_100_total) as reading_50_100_total 
    ,sum(x.reading_100_150_total) as reading_100_150_total 
    from 
    ( select id 
    ,hp 
    ,enddate 
    ,case when reading >= 0 and reading <= 50 THEN 1 ELSE 0 END as reading_0_50_count 
    ,case when reading > 50 and reading<= 100 THEN 1 ELSE 0 END as reading_50_100_count 
    ,case when reading > 100 and reading<= 150 THEN 1 ELSE 0 END as reading_100_150_count 

    ,case when reading >= 0 and reading <= 50 THEN hp ELSE 0 END as reading_0_50_total 
    ,case when reading > 50 and reading<= 100 THEN hp ELSE 0 END as reading_50_100_total 
    ,case when reading > 100 and reading<= 150 THEN hp ELSE 0 END as reading_100_150_total 
    from readings 
)x 
    group by x.id,x.enddate 
) p 
group by YEAR(enddate)*100 + MONTH(enddate) 
+0

Danke @Malk - das funktioniert – Bee

Verwandte Themen