02. august 2006 - 18:06Der er
13 kommentarer og 1 løsning
Problemer med gennemsnit
Hej
Jeg har en tabel med følgende data [t_data]: id telfonnummer varighed_kald dato_for_kald
Hver mogen ønsker jeg at kunne trække en liste som fortæller mig, hvilke telefonnumre som har været brugt mindre denne dag end 30% af gennemsnittet af de forrige 7 dage.
Mit problem er, at jeg godt kan få den til at summere hver dag med sum(varighed_kald) group by dato_for_kald, men hvordan kan jeg efterfølgende få den til at beregne gennemsnittet for alle dagene i kaldet 7, og er det overhovedet muligt med en SQL sætning.
Et andet problem er, at jeg gerne vil have beregnet et gennemsnit af de 7 forrige dage, dvs. dags dato skal ikke være med i gennemsnittet. Det kan jeg godt klare, men hvis jeg i samme udtræk ønsker data om dags data, hvordan gør man så, og kan det overhovedet lade sig gøre.
Hvis det skal deles i flere sætninger hvordan gør man så smartest ?
Hvilken mysql-version? For med to subqueries kan det vel godt lade sig gøre i et enkelt kald. Du kan dog ikke gøre det i en version uden subqueries tror jeg - altså mindre end mysql 4.1
jeg kan ikke huske versionen af databasen, men subqueryes er i hvert fald muligt, så den må være > 4.1.
Med hensyn til gennemsnit hvordan klarer jeg den, jeg skal have et gennemsnit af varigheden, men hvis jeg bruger avg(varighed_kald) og Group by date, så kommer der jo 7 dage ud. Og hvis jeg grupperer pr id, så regner den jo gennemsnit pr kald. Hvordan grupperer jeg, så jeg kun får et gennemsnit ud for de syv dage men i længdeaf en dag?
jeg kan selvfølgelig bare få databasen til regne summen ud og så "selv" regne gennemsnittet, men jeg har en forestilling om, at databasen er hurtigere til beregne gennemsnittet end asp. Hvis i mener dette ikke er tilfældet, så er der ikke noget porblem.....
det er bare mig som ikke kan regne. Kan du komme med et eksmpel på en subselect, det behøver ikke have noget med ovenstående at gøre. Jeg kan kun få subselect til at virke hvis jeg bruger det som SELECT * FROM tabel1 WHERE id IN (SELECT id FROM tabel2) , men jeg synes ikke jeg kan udtænke et metode hvor jeg kan få gennemsnittet ud. Er der andre måder man kan lave subselects?
Jeg er med nu, selv om det tog lidt tid. Men ønsket er, at der beregnes et gennemsnit for hvert nummer. Gennemsnittet skal beregnes som ovenstående. Altså, først en sum pr dag pr nummer, og så et gennemsnit af summene stadig pr dag.
Men tak for hjælpen. Der er lykkedes at lave det hele i en SQL, den giver nok ikke så meget mening fra udefrakommende, men her kommer den alligevel:
SELECT GNS.Dial_string, AVG(GNS.SumDuration)*0.3 AS avgDur30, CUR.SumDuration AS CurDur FROM (SELECT D.dial_string, SUM(D.duration) As SumDuration, D.Date From t_telco_data D WHERE (DateDiff(now(),D.date)<9) AND (DateDiff(now(),D.date)<>1) GROUP BY D.Date, D.dial_string) GNS LEFT JOIN (SELECT D.dial_string, SUM(D.duration) As SumDuration, D.Date From t_telco_data D WHERE (DateDiff(now(),D.date)=1)GROUP BY D.Date, D.dial_string) CUR ON GNS.Dial_string=CUR.dial_string GROUP BY dial_string HAVING (avgDur30>CurDur) OR (ISNULL(CurDur) AND avgDur30<>0);
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.