2012.09.11 23:50
nie myślałem dotąd, że się nie da, ale i nie myślałem, że się da zagnieżdżać funkcje agregujące, bo nie miałem po co

Wyobraźmy sobie, że mam w bazie danych tabelę z osobami. Dla każdej mam podaną wagę. Chcę policzyć wariancję wagi nie korzystając z gotowej funkcji agregującej stddev. Można by to zrobić zapytaniem "select *, sum((waga - avg(waga))^2) from zawodnicy". Niestety - Postgres nie pozwala zagnieżdżać funkcji agregujących. O, ciekawe. Dotąd nie myślałem w ogóle o tym, żeby je tak zagnieżdżać. Muszę się przyjrzeć, jak to jest w innych bazach danych.

komentarze:
2012.09.11 23:53 Piotrek

A, więc można traktować to jako ciekawą zagadkę eskuelową: policz wariancję nie korzystając z stddev.


2012.09.12 01:27 Daniel

Podzapytaniem?

select sum((waga - avgw)^2) from zawodnicy, (select avg(waga) avgw from zawodnicy) avgw

działa w Postgresie 9.1.4. Co śmieszniejsze, dla przykładowego zestawu danych wychodzi mi z tego 162.0000000000000000, podczas gdy z select stddev(waga)^2 from zawodnicy wychodzi 161.9999999999999990. Pewnie dlatego, że w drugim przypadku gubi się dokładność przy przechodzeniu przez pierwiastek i odchylenie standardowe.


2012.09.12 02:39 Piotrek

Dobra, ale spróbuj policzyć to w podziale na kraje (każdy zawodnik jest z jakiegoś kraju, w każdy kraju jest kilku zawodników). Mi wtedy wychodzi dziwnie - wariancja jest inna od policzonej przez podniesienie odchylenia standardowego do kwadratu:
select kraj, stddev(waga)^2, sum((waga-srednia)^2)/count(*) from zawodnicy natural join (select kraj, avg(waga) as srednia from zawodnicy group by kraj) as x group by kraj;


2012.09.12 02:52 Piotrek

Dobra, nieważne. Powinienem był użyć funkcji stddev_pop, a nie stddev, która jest aliasem do stddev_samp. Wtedy się zgadza.



ksywa:

tu wpisz cyfrę cztery: (tu wpisz cyfrę cztery: (to takie zabezpieczenie antyspamowe))

komentarze wulgarne albo co mi się nie spodobają będę kasował


powrót na stronę główną

RSS