Miten keskiarvon sijasta saisi Mediaanin MySQL:ssa?
Mediaani
3
1741
Vastaukset
- I.Proqatlis
Olisiko tästä apua:
http://www.1keydata.com/sql/sql-median.html- I.Proqatlis
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. - 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
IL - Patteriauto syttyi parkkihallissa Tampereella - 50 autoa LUNASTUKSEEN!
"Palon aikaan parkkihallissa oli 90 autoa, joista noin 50 tuhoutui palossa korjauskelvottomiksi. Lisäksi palo vaurioitti24945399Kristillisistä Siionisteista asiallista tietoa Hesarissa.
KD ja Persut ovat kaiken takana avoimesti!3211264Persut JYTKYTTÄÄ ylös, ohi kepun! +2,1 %
Persut palasi kolmen suurimman joukkoon ja on matkalla kohti kevään 2027 eduskuntavaalivoittoa. Sosialistit ovat syöksy21110902Sanna Marin saa ylistystä Hillary Clintonilta
Jos joku ei tiedä kuka tämä rouva Hillary Clinton on, niin kerrottakoon "fun fact", eli hän on se keneltä Donald Trump369721Ja jälleen uusi latauksessa olleen sähköauton palo! Nyt Keravan Prisman parkkihallissa.
IS 3.10.2025 Latauksessa ollut sähköauto syttyi yöllä tuleen Keravan Prisman parkkihallissa, Keski-Uudenmaan pelastusla858538Gallup, PS:lle JÄRISYTTÄVÄ nousu, SDP suurin laskija
https://yle.fi/a/74-20186114 PS kovaa vauhtia nousemassa ennen 2027 vaaleja suurimmaksi puolueeksi. Nyt mennään jo etua2306539Pirjo sanoi Esalle
Painu sinä Esa hevonvittuun... johon Esa? Laittakaapa ehdotuksia. # ==================== # APUFUNKTIO: satunnainen kok03220Jos mä joisin
Itteni känniin nyt, voi olla että mä tunnustaisin sulle kuinka ihastunut oon ollu suhun viimeiset 2 vuotta. Eikä mua pys302259- 391727
Koulu-uhkaus.
Meinaatteko päästää lapsenne kouluun, niin kauan kun tämä uhkaaja siellä myös on? Tekijä on kaikilla tiedossa.261540