Avatar billede dta Nybegynder
21. december 2008 - 18:59 Der er 11 kommentarer og
1 løsning

Statistik per dag med gennemsnit

Jeg har en tabel med angivelse af hvornår en side er blevet vist angivet ved et ID og et timestamp.

Ud fra denne tabel vil jeg gerne have opbygget en ny tabel som giver følgende:
En records per ID per dag med antallet af View og gennemsnittet per dag.

Jeg bruge idag denne funktion som giver view per dag men ikke gennemsnittet per dag.

ALTER PROCEDURE dbo.UpdateStatistics
   
AS
begin
    DECLARE @LastDate Datetime
    DECLARE @MaxDate Datetime
    SELECT  @LastDate = Max(TheDate) FROM DayStatistics
    IF( @LastDate IS NULL )
        Select @LastDate = min(Created) FROM ViewLog
 
    IF  DATEADD(dd, 0, DATEDIFF(dd, 0, @LastDate)) = DATEADD(dd, -1, DATEDIFF(dd, 0, GETDATE()))
        RETURN 0
   
    INSERT INTO DayStatistics
      (TurnamentID, TheDate, Count, Average, Signups)
      (SELECT TurnamentID, DATEADD(dd, 0, DATEDIFF(dd, 0, Created)) AS TheDate, COUNT(*) AS Count, 0 , 0
      FROM ViewLog
      WHERE (Created < DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))) AND (Created < DATEADD(dd, 999999, @LastDate)) AND (Created > @LastDate)
      GROUP BY TurnamentID, DATEADD(dd, 0, DATEDIFF(dd, 0, Created))
      )
   
    SELECT  @MaxDate = Max(TheDate) FROM DayStatistics
    RETURN DATEDIFF(dd, @LastDate, @MaxDate)
end
Avatar billede ejldk Nybegynder
21. december 2008 - 19:31 #1
for at finde gennemsnitte skal du jo bare ligge alle views sammen, og dividerer med det antal dage de views er kommet på.
Avatar billede dta Nybegynder
21. december 2008 - 19:37 #2
Tak! jeg kender formlen for gennemsnit
Avatar billede HenrikSjang Nybegynder
21. december 2008 - 19:54 #3
Antagelse:

Du har et TurnamentId på følgende dage:
2008-01-01 : antal=4
2008-01-02 : antal=8
2008-01-03 : antal=0

Skal alle tre rækker så indeholde gennemsnittet som jo er 4? Eller skal dag 1 indeholde 4, og dag 2 indeholde 6 (gennemsnittet af 4 og 8) og dag 3 så 4 igen (gennemsnit af 4, 8 og 0)?

Spørgsmålet er, skal alle eksisterende rækker opdateres med et samlet gennemsnit af alle date hvor det pågældende id er repræsenteret, eller er det kun den nyeste række der skal indeholde en gennemsnit af alle rækker?
Avatar billede dta Nybegynder
21. december 2008 - 20:00 #4
En dag giver x antal række lig med antallet af ID'er så en tabel kan se ud som følgende

2008-01-01 ID= 3 ANTAL 2
2008-01-01 ID= 4 ANTAL 4
2008-01-01 ID= 5 ANTAL 6
2008-01-01 ID= 6 ANTAL 8
2008-01-01 ID= 7 ANTAL 10

Samtlig rækker for en dato skal indeholde et gennemsnit nemlig gennemsnitsberegningen af alle rækker for dagen i ovenstående tilfælde vil alle 5 rækker indeholde gennemsnittet 6 .

2008-01-01 ID= 3 ANTAL 2 AVG=6
2008-01-01 ID= 4 ANTAL 4 AVG=6
2008-01-01 ID= 5 ANTAL 6 AVG=6
2008-01-01 ID= 6 ANTAL 8 AVG=6
2008-01-01 ID= 7 ANTAL 10  AVG=6
Avatar billede Syska Mester
21. december 2008 - 20:26 #5
UPDATE DayStatistics SET AVG = (SELECT TOP 1 AVG(ANTAL) FROM DayStatistics WHERE DayStatistics.TheDate = TheDate)
Avatar billede HenrikSjang Nybegynder
21. december 2008 - 20:29 #6
buzzzz's fremgangsmåde med at tilføje en update ville jeg nok også vælge at gøre under de givne omstændigheder.
Avatar billede arne_v Ekspert
21. december 2008 - 20:31 #7
Noget helt andet: er det smart at gemme aggregerede data i en tabel på den måde ?

Hvis det er for besværligt at putte i SQL sætninger, så lave et view.

Er det for langsomt at bruge det view, så lav det som et materialized view
(kaldes vist indexeret view i SQLServer).
Avatar billede dta Nybegynder
21. december 2008 - 20:56 #8
buzzzz: Det ser ud som alle records får samme gennemsnit og ikke kun dem med samme dato, resultat skulle være som nedestående men alle datoer får samme gennemsnit?

2008-01-01 ID= 3 ANTAL 2 AVG=6
2008-01-01 ID= 4 ANTAL 4 AVG=6
2008-01-01 ID= 5 ANTAL 6 AVG=6
2008-01-01 ID= 6 ANTAL 8 AVG=6
2008-01-01 ID= 7 ANTAL 10  AVG=6
2008-01-02 ID= 3 ANTAL 2 AVG=3
2008-01-02 ID= 4 ANTAL 4 AVG=3
Avatar billede dta Nybegynder
21. december 2008 - 20:58 #9
arne v: En af grundene er at at spare tid når data skal vises, en anden er at spare plads på SQL Serveren
Avatar billede dta Nybegynder
21. december 2008 - 21:15 #10
Tak Buzzzzzz du ledte mig på vejen denne virker

UPDATE DayStatistics SET Average = (SELECT TOP 1 AVG(Visit) FROM DayStatistics AS D2 WHERE D1.TheDate = D2.TheDate) FROM DayStatistics AS D1

Smid et svar
Avatar billede Syska Mester
21. december 2008 - 21:42 #11
svar.

Ja ... tog chancen uden at teste selv. Men som du har gjort lader jo til at virke, udover sidste Alias vist er overflødigt ... vist kun det inden i den subselect der skal med ...

Men som Arve_v siger, ville jeg nok også overveje at lave et view af det ... tvivler på performance dropper noget du vil lægge mærke til ...

// ouT
Avatar billede Syska Mester
21. december 2008 - 21:48 #12
svar
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