[mysql] Grupowanie danych i ilość przedziałów

0

mam tabelę pomiary:

DROP TABLE IF EXISTS `bmi`.`pomiary`;
CREATE TABLE  `bmi`.`pomiary` (
  `WIEK_LATA` int(10) unsigned NOT NULL auto_increment,
  `WAGA_KG` float unsigned NOT NULL,
  `WZROST_CM` float unsigned NOT NULL,
  PRIMARY KEY  (`WIEK_LATA`,`WAGA_KG`,`WZROST_CM`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1;

oraz dane:

INSERT INTO pomiary VALUES(19,45,167);
INSERT INTO pomiary VALUES(19,52,165);
INSERT INTO pomiary VALUES(20,62,173);
INSERT INTO pomiary VALUES(20,71,187);
INSERT INTO pomiary VALUES(21,49,165);
INSERT INTO pomiary VALUES(21,90,189);
INSERT INTO pomiary VALUES(22,41,150);
INSERT INTO pomiary VALUES(22,45,148);
INSERT INTO pomiary VALUES(23,64,170);
INSERT INTO pomiary VALUES(23,68,173);
INSERT INTO pomiary VALUES(24,56,163);
INSERT INTO pomiary VALUES(24,62,173);
INSERT INTO pomiary VALUES(25,56,168);
INSERT INTO pomiary VALUES(25,95,208);
INSERT INTO pomiary VALUES(27,75,190);
INSERT INTO pomiary VALUES(27,83,179);
INSERT INTO pomiary VALUES(28,72,178);
INSERT INTO pomiary VALUES(28,74,169);

jak tez zapytanie:

SELECT WIEK_LATA, (WAGA_KG/(WZROST_CM *WZROST_CM)) as BMI, STDDEV_POP((WAGA_KG/(WZROST_CM *WZROST_CM))) as ODCHYLENIE FROM bmi.pomiary GROUP BY WIEK_LATA;

Jak widać dane są grupowane po WIEK_LATA, jednak mnie to nie zadowala ponieważ chciałbym, aby dane były grupowane w określoną liczbę równych przedziałów od AVG - STDDEV_POP do AVG + STDDEV_POP.

szukałem już po grupach i w manualu mysql'a ale nie znalazłem odpowiedzi.

0

nie dokonca rozumiem ale moze HAVING pomoze

0

Ja tez nie do konca rozumiem ?

A z czego ma byc liczone AVG i STDDEV_POP ?

Czy z tych wyszczegolnionych przedzialow (ale jak je wyszczegolnic skoro nie mamy AVG),
czy tez najpierw z calosci a potem przedzialy.

0

@gpx, nie w tym problem :) HAVING jest odpowiednikiem prostego IFa i pozwala na nałożenie jednego dodatkowego warunku. W tym przypadku chodzi o uzyskanie rezultatów w postaci pewnej zadanej liczny N wierszy

edit:
@reichel, STDDEV_POP jest już policzone obecnie doszedłem do etapu w którym wiem że najpierw trzeba wyciągnąć podzapytaniem wartości BMI i następnie policzyć średnią, odchylenie i podzielić całość na n wierszy. Problem jest z tym ostatnim :)

0

Koziołek jakies karkolomne zapytania tworzysz, szacunek ;)

0

Zrobił bym to inaczej poprzez zdefiniowanie funkcji w pgjava pod postgresem i nie bawiłbym się w kombinowanie po prostu bym wybrał wszystkie BMI i potem tym manewrował w funkcji, ale niestety muszę się użerać z durnym mysqlem w którym nie ma takich udogodnień jak dodatkowe dialekty

0

Doprowadzajac do uproszczenia (pewnego - aby nie poslugiwac sie tymi wszytskimi bmi etc)

create table s (a double);

kilka razy
insert into s values (rand());

select * from s;
+--------------------+
| a |
+--------------------+
| 0.904655438759043 |
| 0.880618672706763 |
| 0.68912707799033 |
| 0.803779402565006 |
| 0.951515809587683 |
| 0.346240870977045 |
| 0.87665695685582 |
| 0.344562202081608 |
| 0.0928401705742256 |
| 0.43051427735995 |
| 0.874050905810716 |
| 0.0787117277073783 |
+--------------------+
12 rows in set (0.01 sec)

wybieram przedzial co 0.1 (tu odleglosc od zera etc .. mysle, ze sobie poradzisz)

mysql> select *, a/0.1 from s;
+--------------------+------------------+
| a | a/0.1 |
+--------------------+------------------+
| 0.904655438759043 | 9.0465543875904 |
| 0.880618672706763 | 8.8061867270676 |
| 0.68912707799033 | 6.8912707799033 |
| 0.803779402565006 | 8.0377940256501 |
| 0.951515809587683 | 9.5151580958768 |
| 0.346240870977045 | 3.4624087097704 |
| 0.87665695685582 | 8.7665695685582 |
| 0.344562202081608 | 3.4456220208161 |
| 0.0928401705742256 | 0.92840170574226 |
| 0.43051427735995 | 4.3051427735995 |
| 0.874050905810716 | 8.7405090581072 |
| 0.0787117277073783 | 0.78711727707378 |
+--------------------+------------------+
12 rows in set (0.00 sec)

mysql> select *, ceil(a/0.1) from s;
+--------------------+-------------+
| a | ceil(a/0.1) |
+--------------------+-------------+
| 0.904655438759043 | 10 |
| 0.880618672706763 | 9 |
| 0.68912707799033 | 7 |
| 0.803779402565006 | 9 |
| 0.951515809587683 | 10 |
| 0.346240870977045 | 4 |
| 0.87665695685582 | 9 |
| 0.344562202081608 | 4 |
| 0.0928401705742256 | 1 |
| 0.43051427735995 | 5 |
| 0.874050905810716 | 9 |
| 0.0787117277073783 | 1 |
+--------------------+-------------+
12 rows in set (0.01 sec)

i ostatecznie

(pozamykane w przedzialy [x,x+0.1)

mysql> select count(), ceil(a/0.1) from s group by ceil(a/0.1);
+----------+-------------+
| count(
) | ceil(a/0.1) |
+----------+-------------+
| 2 | 1 |
| 2 | 4 |
| 1 | 5 |
| 1 | 7 |
| 4 | 9 |
| 2 | 10 |
+----------+-------------+
6 rows in set (0.02 sec)

to na szybciora teraz .... ma nadzieje ze to to

0

na to wychodzi że to to :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1