Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pobieranie średniej wartości z kilku rekordów
Forum PHP.pl > Forum > Przedszkole
Mustava
Mam w bazie mysql dane liczbowe o zakresie -50 do 150
Jak pobierając je dokonać uśrednienia zależnego od zewnętrznego paramatru - liczby np 8.255 (lub innej).
Trzeba ilość rekordów w zapytaniu podzielić przez parametr w wyniku czego powstaną 'paczki" których elementy należy dodać do siebie i podzielić przez liczbę elementów w "paczce".
Niby proste, ale nie wiem jak toto "zmajstrować", to co wyrzeźbiłem nie do końca działa porawnie (np gdy w paczce końcowej jest mniej elementów nić parametr to nie dokonuje się uśrednienie)

    1. [*]$parametr=8.255;//może przyjmować wartość od 0 do 20, może nieco więcej
    2. $x=""; //paczka/suma wartości z kilku rekordów z której będzie wyliczona średnia
    3. $i=""; //numer rekordu w 'paczce' do uśrednienia
    4. $a=""; //numer kolejny wyliczonej średniej z 'paczki'
    5. $wynik=""; //zbiór liczb (wyliczonych średnich) rozdzielonych przecinkiem
    6. while($row=mysql_fetch_array($result))
    7. {
    8. if($parametr==""){$rekord_wynikowy=$row['wartosc'];}
    9. else
    10. {
    11. $t=$row['wartosc'];
    12. if ($i<$parametr+1) //jeżeli zmienna $i(nr rekordu wchodzącego w skład 'paczki') jest mniejsza od parametru
    13. {
    14. $x=$x+$t; //pod zmienną $x podstaw porzednia wartość zmiennej $x oraz dodaj nową wartość
    15. echo"x:$x<br>";
    16. }
    17. else
    18. {
    19. $rekord_wynikowy=$x/$parametr+1; //wyliczenie średniej
    20. echo"$a: $rekord_wynikowy<br>";
    21. $x="";
    22. $i="";
    23. $a++;
    24. }
    25. $i++;
    26. }
    27. $wynik .= $rekord_wynikowy.',';
    28. }
  • erix
    Cytat
    Jak pobierając je dokonać uśrednienia zależnego od zewnętrznego paramatru - liczby np 8.255 (lub innej).

    Tzn? Trochę jaśniej?

    Ale strzelam w ciemno, że problem może tkwić w braku nawiasów, a stąd w błędnej kolejności działań:
    1. $rekord_wynikowy=$x/$parametr+1;

    Chyba, że to ma tak być. winksmiley.jpg
    Mustava
    Jest np 1650 rekordów
    Dzielę tą ilość przez 8.255
    Wychodzi, że muszę wyliczyć średnią wartość z każdych 8 (a może 9) rekordów i zapisać jako jedna wartość i tak następne 8 rekordów, itd
    Jeżeli na końcu zostanie mi np 6 rekordów to już ich nie wyliczy - nie mam ostatniej średniej.

    Może można zrobić to po stronie mysqla?

    przykładowy wynik:
    Kod
    [b]158[/b] 20.587628866
    ....
    x:19
    x:38
    x:57
    x:77
    x:97
    [b]159[/b] 21
    x:20
    x:40
    x:60
    x:80
    x:100
    [b]160[/b] 21.618556701
    x:20
    x:40
    x:60
    x:80
    x:101
    [b]161[/b] 21.824742268
    x:21
    x:42
    Rekordów:970 - parametr:4.85


    Naprawdę nikt nie wie?
    To chyba nie jest jakieś super skomplikowane dla kogoś kto "siedzi" w programowaniu - dla mnie jak na razie trochę za trudne.

    Mój problem może być chyba podobny do przygotowania danych do wykreowania wykresu (np dwa tysiące danych do wyświetlenia na wykresie na osi X na obrazku o szer np 300px - trzeba chyba obliczyć średnie wartości - np 100 wartości)

    PS nie chodzi o ew. problem braku nawiasów
    celbarowicz
    jeśli dane są w granicach od -50 do 150 to gdyby wykonywać wykres zmieściłyby się w wysokości ekranu. jeśli wysokość ma być mniejsza to wystarczy daną liczbę podzielić przez np 2 . wysokość wykresu będzie 2 razy mniejsza ( z tym 8... wykres byłby zbyt płaski). jeśli chodzi o ilość danych to każda liczba może być przedstawiona jako jeden piksel wzdłuż ekranu.
    gdy ekran ma rozdzielczość 800px szerokości na wykresie możesz przedstawić około 800 danych.
    skrypt może kontrolować ilość danych i tak jak kombinujesz łączyć je w paczki, aby nie przekroczyć szerokości dostępnego ekranu. np przy ilości danych 2300 łączyć w paczki po 3 dane i brać średnią arytmetyczną.
    możesz zgłosić się na pw to pogadamy.
    Mustava
    Dzięki za odpowiedź.
    Mogę oczywiście na PW, ale może kiedyś ktoś będzie miał podobny problem więc...

    1. Nie chodzi mi o wysokość - os Y, oczywiście tak jak piszesz, jeżeli byłaby konieczność to wszystkie wartości podzielić przez taką sama liczbę i OK
    2. Chodzi o os X - szerokość. chcę mieć ok 200 danych na szerokość (nie chce "zagęszczać").
    Potrzebuję toto do trochę czegoś innego, ale możemy "jechać" dalej na przykładzie wykresu biggrin.gif

    A więc proszę o pomoc w prawidłowym dzieleniu na paczki (jeżeli to co ja "wyczyniłem", odbiega od standardu czy jest nieco chore wstydnis.gif ) i obliczaniu średnich wartości.
    Ew. link z przykładem(mi).
    To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
    Invision Power Board © 2001-2025 Invision Power Services, Inc.