logi sisse meist KKK

Tere Mul on tabel erinevate aegadega. Vaja oleks näha keskmisi aegasi erinevate aegade vahel.

Toon toimiva näite, mis arvutab aritmeetilist keskmist aega nende vahel. Vaja oleks see muuta nii et näitaks mediaani. Mediaan on positsiooniline keskmine. Kui ajad järjestada kasvavas järjekorras, siis keskmine positsioon on mediaan.

Selle saan muidugi leida üksiku ajavahe puhul mysql manuaalist toodud näite abil SELECT x.val from data x, data y GROUP BY x.val HAVING SUM(SIGN(1-SIGN(y.val-x.val))) = (COUNT(*)+1)/2

Kuna mul on aegasid umbes 10 ja erinevaid gruppe (6) ja liike (ca.30) ka päris palju siis ma pean iga nn. lahtri jaoks uue päringu moodustama, mis teeb lehe väga aeglaseks. Olemasoleva päringuga saan need korraga kätte.

SELECT grupp, liik, count(*) as summa,
sec_to_time(avg(time_to_sec(timediff(aeg2,aeg1)))) as vahe1,
sec_to_time(avg(time_to_sec(timediff(aeg3,aeg2)))) as vahe2,
... ja nii umbes 10 aega ...
FROM tabel WHERE mingid_lisatingimused
GROUP by grupp, liik

küsitud Jan 30 at 18:48

Arvi's gravatar image

Arvi
312


Võib-olla VIEW tegemine aitab... ehk siis midagi sellist:

CREATE VIEW Vahed AS
    SELECT grupp, liik, ... (muud asjad mida filtrites kasutad)
        time_to_sec(timediff(aeg2,aeg1)) as vahe1,
        time_to_sec(timediff(aeg3,aeg2)) as vahe2,
        ...
FROM table

SELECT grupp, liik, avg(vahe1), avg(vahe2) ...
FROM Vahed
WHERE lisatingimused
GROUP BY grupp, liik
link

vastatud Jan 30 at 20:33

egon's gravatar image

egon ♦♦
71138

edited Jan 30 at 20:35

Jah aga siin on sama avg mis ei sobi, vaja oleks mediani.

(Jan 30 at 20:47) Arvi

Tere Sain asja valmis ja töötab üsna hästi. Ei ole märgatavat kiiruse vahet tunda kui arvutan mediaane.

Teen täispäringu andmebaasi, saamaks erinevate aegade sekundilised vahed.

$sql_median="select yksus, liik,

time_to_sec(timediff(vsoidu_aeg,teate_aeg)) as reag,

time_to_sec(timediff(sk_saab,teate_aeg)) as joudmine,

...

where tingimused

Andmed kogun nii massiivi

$med["reag"][$row["liik"]][$row["yksus"]][]=$row["reag"];

$med["joudmine"][$row["liik"]][$row["yksus"]][]=$row["joudmine"];

.....

Ja lisaks aritmeetilisele näidatakse vastavas kohas mediaani nii Median($med[$var_lahter][$var_liik][$var_yksus])

Median funktsioon ise on selline

PHP kood:

function Median($massiiv){ // massiivis on iga element sekundites.
    if (is_array($massiiv)){ // kas ikka on massiiv
        for ($i = 0; $i < count($massiiv); $i++) {  
            if ($massiiv[$i] == null) unset($massiiv[$i]); // eemaldame null väärtused
        }
        $count = count($massiiv); // massiivi pikkus
        sort($massiiv, SORT_NUMERIC); //sorteerime ära 
        if($count < 2)
            $aeg = false;
        if($count === 2)
            $aeg = ($massiiv[0] + $massiiv[1])/2;
        if($count % 2)
            $aeg = $massiiv[($count/2)];
        else
            $aeg = ($massiiv[($count/2)] + $massiiv[($count/2 - 1)])/2 ;
        return gmdate("H:i:s",$aeg); // väljastame aja
    }else
    return false;
}
link

vastatud Feb 14 at 20:42

Arvi's gravatar image

Arvi
312

edited Feb 14 at 20:45

Sinu vastus
toggle preview

Jälgi seda küsimust

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or __italic__
  • **bold** or __bold__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Pinu tööpakkumised

kõik pakkumised »

Sildid:

×9

küsitud: Jan 30 at 18:48

nähtud: 401 korda

viimati uuendatud: Feb 14 at 20:45

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee