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.
powrót na stronę główną
RSS