Mediaani

MySQL

Miten keskiarvon sijasta saisi Mediaanin MySQL:ssa?

3

1686

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • I.Proqatlis
      • I.Proqatlis

      • I.Proqatlis
        I.Proqatlis kirjoitti:

        Tässä on ehkä helpommin tajuttavaa tekstiä:

        http://www.rocket99.com/techref/8686.html

        Googleta "median sql" niin saat koko joukon sivuja, joista voit löytää apua.

        Olin viitseliäs ja kehitin oman MySQL-versioni ylläolevassa viestissäni mainitun saitin algoritmista.

        Idea on seuraava. Luodaan tietokantaan proseduuri, joka laskee annetun joukon mediaaniarvon.

        1. Käytetään aputauluja tyotaulu ja mediaani. Vanhat mahdollisesti olemassaolevat taulut poistetaan tietoineen kannasta ja uudet luodaan tilalle.

        2. Työtaulu populoidaan sillä joukolla, jonka mediaaniarvo halutaan laskea. Tässä kysyjän pitää käyttää omaa tietokantaansa. Esimerkissäni minulla on tietokanta nimeltä jalkapallo. Se sisältää mm. taulun nimeltä tilanteet, ja tässä taulussa on kenttä tehdytMaalit. On huomattava, että arvot tulee insertoida suuruusjärjestyksessä.

        3. Tämän jälkeen selvitetään, montako riviä työtaulussa on.

        4. Mediaani siis on suuruusjärjestyksessä olevan joukon keskimmäinen luku, jos alkioita on pariton määrä. Jos taas määrä on parillinen luku, mediaani on kahden keskimmäisen keskiarvo.

        floor(riviMaara / 2) palauttaa suurimman kokonaisluvun, joka on enintään (riviMaara / 2):n suuruinen.

        Jos rivimaara on 15, tulos on siis 7. Jos rivimaara on 16, tulos on 8.

        5. Muuttuja keskiPiste saa arvon hieman eri tavoin riippuen siitä, onko alkiomäärä parillinen vai pariton. Menettely käynee koodista selville. Sitten otetaan suurin keskipisteestä vasemmalle oleva alkio sekä pienin keskipisteestä oikealle oleva alkio ja lasketaan näiden keskiarvo.

        6. Edellisessä kohdassa saatu arvo talletetaan mediaani-tauluun, josta se voidaan lukea. Vaihtoehtoinen tapa olisi palauttaa arvo output-muuttujassa. Kysyjä voi valita haluamansa tavan.

        Seuraava create procedure -operaatio luo tietokantaan proseduurin LaskeMediaani. Sen jälkeen sitä voidaan kutsua esim. kirjoittamalla MySQL Query Browserin ikkunassa

        call LaskeMediaani();

        Tämä toimii MySQL 5 -versiossa ja olen sen siinä myös testannut. Jos jotain jäi hämäräksi, niin vastaan mahdollisesti esille nouseviin kysymyksiin! Kysyjän pitää muokata muuttujat itselleen sopiviksi, jos hän haluaa laskea desimaalilukuja sisältävän joukon mediaanin. Esimerkissäni esiintyy vain kokonaislukuja.

        ---------------------------------------------------------------------------------------------------

        DELIMITER $$

        DROP PROCEDURE IF EXISTS `jalkapallo`.`LaskeMediaani` $$
        CREATE PROCEDURE `jalkapallo`.`LaskeMediaani` ()
        BEGIN

        declare riviMaara integer unsigned;
        declare vasenArvo integer unsigned;
        declare oikeaArvo integer unsigned;
        declare jakoJaannos integer unsigned;

        declare keskiPiste decimal(6, 1);
        declare mediaaniArvo decimal(6, 1);

        drop table if exists tyotaulu;
        drop table if exists mediaani;

        create table tyotaulu (
        jnro integer unsigned not null auto_increment,
        arvo integer unsigned not null,
        primary key (jnro)
        );

        create table mediaani (
        arvo decimal(4, 1)
        );

        insert into tyotaulu (arvo)
        select tehdytMaalit from tilanteet order by tehdytMaalit;

        set riviMaara = ( select count(*) from tyotaulu ) ;
        set keskiPiste = ( select floor(riviMaara / 2 ));
        set jakoJaannos = ( select mod(riviMaara, 2 ));

        if jakoJaannos > 0 then
        set keskiPiste = keskiPiste 1;
        else
        set keskiPiste = keskiPiste 0.1;
        end if;

        set vasenArvo = (select max(arvo) from tyotaulu where jnro = keskiPiste);

        set mediaaniArvo = (vasenArvo oikeaArvo) / 2;

        insert into mediaani (arvo) values (mediaaniArvo);

        END $$

        DELIMITER ;







           


    Ketjusta on poistettu 1 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Ja taas ammuttu kokkolassa

      Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.
      Kokkola
      60
      5798
    2. Mitä siellä ABC on tapahtunut

      Tavallista isompi operaatio näkyy olevan kyseessä.
      Alajärvi
      115
      5010
    3. Helena Koivu on äiti

      Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.
      Kotimaiset julkkisjuorut
      406
      2967
    4. Ovatko naiset lopettaneet sen vähäisenkin vaivannäön Tinderissa?

      Meinaan vaan profiileja selatessa nykyään valtaosalla ei ole minkäänlaista kirjoitettua tekstiä siellä. Juuri ja juuri s
      Nettideittailu
      96
      1455
    5. Suomi vietiin Natoon väärin perustein. Viides artikla on hölynpölyä. Yksin jäämme.

      Kuka vielä uskoo, että viides artikla takaa Suomelle avun, jos Suomeen hyökätään. Liikuttavasti täällä on uskottu ja ved
      Maailman menoa
      340
      1129
    6. Et ilmeisesti aio enää ikinä olla tekemisissä

      Että näinkö se menee
      Ikävä
      65
      971
    7. Kuvaile elämäsi naista

      Millainen hän on? Mikä tekee hänestä sinulle erityisen?
      Ikävä
      29
      968
    8. Sydämeni on sinun luona

      Koko ajan. Oli ympärilläni ketä oli niin sinä olet vain ajatuksissa ja tunteissa. En halua muiden kosketusta kuin sinun
      Ikävä
      46
      886
    9. Trump ja Venäjä

      Huomasitteko muuten... Käytännössä ainoat valtiot, joille Trump EI eilen asettanut typeriä tariffejaan, olivat Venäjä ja
      Maailman menoa
      109
      867
    10. Jatkuva stressitila

      On sinun vuoksesi kun en tiedä missä mennään mutta tunteeni tiedän ainoastaan
      Ikävä
      52
      839
    Aihe