Avatar billede tofte Juniormester
02. august 2006 - 18:06 Der 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 ?

På forhånd tak
Rasmus
Avatar billede erikjacobsen Ekspert
02. august 2006 - 19:11 #1
"i samme udtræk" - det lyder ikke godt. Men du kan da bare lave 2 udtræk...ik'?
Avatar billede barklund Nybegynder
02. august 2006 - 19:25 #2
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
Avatar billede tofte Juniormester
02. august 2006 - 20:56 #3
tak for kommentarerne

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?
Avatar billede erikjacobsen Ekspert
02. august 2006 - 21:34 #4
Der er mange fortolkningsmuligheder af det du skriver. Kom med et eksempel, der viser hvad du mener.
Avatar billede tofte Juniormester
02. august 2006 - 21:47 #5
Det har du ret i. Jeg håbede bare i forstod det.... ;-) Her kommer lige et eksempel så.

jeg har følgende kald, bare for et nummer:
| id | telefonnummer | varighed_kald | dato_for_kald |
| 1  | 123          | 2            | 02-08-06      |
| 2  | 123          | 4            | 02-08-06      |
| 3  | 123          | 6            | 02-08-06      |
| 4  | 123          | 4            | 02-08-06      |

| 5  | 123          | 4            | 01-08-06      |
| 6  | 123          | 8            | 01-08-06      |
| 7  | 123          | 12            | 01-08-06      |
| 8  | 123          | 8            | 01-08-06      |

Hvis jeg kører sum(varighed_kald) og group by date så får jeg følgende

| dato      | telefonnummer | sum  |
| 02-08-06  | 123          | 16  |
| 02-08-06  | 123          | 32  |

Det jeg så ønsker det er et gennemsnit af summen((16+32)/2), så min SQL retunerer
| telefonnummer | gennemsnit |
| 123          | 14        |


Hvis jeg beder den køre avg(varighed_kald) så får jeg bare gennemsnittet for alle kaldene. Det jeg ønsker er gennemsnittet af summen!
Avatar billede tofte Juniormester
02. august 2006 - 21:50 #6
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.....
Avatar billede erikjacobsen Ekspert
02. august 2006 - 23:25 #7
Ja, måske med en subselect - men hvor kommer 14 fra ?
Avatar billede tofte Juniormester
03. august 2006 - 07:14 #8
hmm 24
Avatar billede tofte Juniormester
03. august 2006 - 07:25 #9
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?
Avatar billede tofte Juniormester
03. august 2006 - 07:33 #10
Tak for hjælpen. Jeg har forstået budskabet nu - det tog bare lidt tid. Smid et svar hvis du vil have points.
Avatar billede barklund Nybegynder
03. august 2006 - 08:23 #11
Har du forstået? Jeg har stadig ikke forstået. Den ene query skal regne det ud for alle numre? Eller skal den query kun regne det ud for et nummer?
Avatar billede tofte Juniormester
03. august 2006 - 08:30 #12
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.

Jeg behøver ikke mere hjælp, tak for hjælpen.
Avatar billede erikjacobsen Ekspert
03. august 2006 - 09:01 #13
Ok, de 14 var bare en regnefejl - det burde jeg da også have gennemskuet. Det er godt med eksempler (hvis de er rigtige...)

Jeg samler slet ikke på point, tak.
Avatar billede tofte Juniormester
04. august 2006 - 08:03 #14
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);
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester