Mediaani

MySQL

Miten keskiarvon sijasta saisi Mediaanin MySQL:ssa?

3

1723

Äänestä

    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. Ensi kesänä

      Näin kesän viimeisenä minuutteina ajattelen sinua. Olisiko seuraava kesä "meidän" kesä? Tänä vuonna ei onnistuttu, mutta
      Ikävä
      70
      3560
    2. Anne Kukkohovin karmeat velat ovat Suomessa.

      Lähtikö se siksi pois Suomesta ? Et on noin kar? mean suuret velat naisella olemassa
      Kotimaiset julkkisjuorut
      148
      3533
    3. Tukalaa kuumuutta

      Tietäisitpä vaan kuinka kuumana olen käynyt viime päivät. Eikä johdu helteestä, vaan sinusta. Mitäköhän taikoja olet teh
      Ikävä
      46
      3322
    4. Sinä, ihastukseni

      Mitä haluaisit tehdä kanssani ensimmäisenä?
      Ihastuminen
      53
      2779
    5. Tiedät ettei tule toimimaan.

      Mielenterveys ei kummallakaan kestä.
      Ikävä
      32
      2036
    6. Okei, myönnetään,

      Oisit sä saanut ottaa ne housutkin pois, mutta ehkä joskus jossain toisaalla. 😘
      Ikävä
      30
      1962
    7. Et siis vieläkään

      Et ilmeisesti ole vieläkään päässyt loppuun asti mun kirjoituksissa täällä. Kerro ihmeessä sit, kun valmista 😁 tuskin k
      Ikävä
      42
      1704
    8. Onko kaivatullasi

      himmeä kuuppa?
      Ikävä
      48
      1676
    9. Mihin hävisi

      Mihin hävisi asiallinen keskustelu tositapahtumista, vai pitikö jonkin Hannulle kateellisen näyttää typeryytensä
      Iisalmi
      96
      1635
    10. On jo heinäkuun viimeinen päivä.

      En taida nähdä sinua koskaan.
      Rakkaus ja rakastaminen
      39
      1400
    Aihe