Grupowanie statystyczne
bebop - 25-03-2006 01:20
Grupowanie statystyczne
Witam
zmagam sie z zadaniem i proslbym o wskazowki dotyczace rozwiazania.
tabela posiada 2 kolumny ID oraz ILOSC_OSOB_W_PRZEDSIEBIORSTWIE. wartosci sa wygenerowane losowo i chcilabym przeprowadzic na nich badanie statystyczne.
zapytanie: SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX (ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" FROM KLASYFIKACJA_CECHY_ZMIENNEJ WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 1 AND 50;
zwraca oczywiscie jedna linie, w jaki sposob uzyskac odpowiedz pogrupowa na przedzialy np 1-50, 50-100, 100-150, 150 i wiecej ?
-- pozdrawiam Piotrek
max - 25-03-2006 01:20
bebop napisał(a): > Witam > > zmagam sie z zadaniem i proslbym o wskazowki dotyczace rozwiazania. > > tabela posiada 2 kolumny ID oraz ILOSC_OSOB_W_PRZEDSIEBIORSTWIE. > wartosci sa wygenerowane losowo i chcilabym przeprowadzic na nich > badanie statystyczne. > > zapytanie: > SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX > (ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, > COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, > MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", > AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" > FROM KLASYFIKACJA_CECHY_ZMIENNEJ > WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 1 AND 50; > > zwraca oczywiscie jedna linie, w jaki sposob uzyskac odpowiedz > pogrupowa na przedzialy np > 1-50, 50-100, 100-150, 150 i wiecej ? > > -- > pozdrawiam > Piotrek > > SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX ... WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 1 AND 50;
UNION ALL
SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX ... WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 51 AND 100;
UNION ALL
SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX ... WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 101 AND 150;
UNION ALL
SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX ... WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE >150
bebop - 25-03-2006 01:21
bebop wrote:
(..) wymodzilem ponizsze zapytanie, petla jest oczywsta , parametry sie zmieniaja, czy da sie zapytanie przedstawic w prostszej formie?
wymodzenie:
SELECT PRZEDZIAL, LICZEBNOSC,"GRANICA PRZEDZIALU", "SREDNIA W PRZEDZIALE" FROM ( SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX (ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" FROM KLASYFIKACJA_CECHY_ZMIENNEJ WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 1 AND 500 UNION SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX (ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" FROM KLASYFIKACJA_CECHY_ZMIENNEJ WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 500 AND 1000 UNION SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX (ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" FROM KLASYFIKACJA_CECHY_ZMIENNEJ WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 1000 AND 1500 UNION SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX (ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" FROM KLASYFIKACJA_CECHY_ZMIENNEJ WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 1500 AND 2000 ) ORDER BY "GRANICA PRZEDZIALU"
-- pozdrawiam Piotrek
bebop - 25-03-2006 01:21
max wrote:
(...) dzieki max :),
doszedlem do tego samego wniosku. samo union troche skaszanilo kwestie i 3a bylo wyniki poszeregowac
.... ale co zrobc w przypadku gdy takich grupowan jest np 50, da sie to jakos uproscic?
-- pozdrawiam Piotrek
Grzegorz Danowski - 25-03-2006 01:21
Uzytkownik "bebop" <bebop2funk@googlemail.com> napisal w wiadomosci news:dvvk8f$2aj$1@inews.gazeta.pl... > Witam > > zmagam sie z zadaniem i proslbym o wskazowki dotyczace rozwiazania. > > tabela posiada 2 kolumny ID oraz ILOSC_OSOB_W_PRZEDSIEBIORSTWIE. > wartosci sa wygenerowane losowo i chcilabym przeprowadzic na nich > badanie statystyczne. > > zapytanie: > SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX > (ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, > COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, > MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", > AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" > FROM KLASYFIKACJA_CECHY_ZMIENNEJ > WHERE ILOSC_OSOB_W_PRZEDSIEBIORSTWIE BETWEEN 1 AND 50; > > zwraca oczywiscie jedna linie, w jaki sposob uzyskac odpowiedz > pogrupowa na przedzialy np > 1-50, 50-100, 100-150, 150 i wiecej ? >
1. Zrób sobie tabelke: Create Table Przedzialy( DolnyProg Int Primary Key, GornyProg Int Null )
2. Wrzuc tam wszystkie przedzialy, czyli np. Insert Into Przedzialy(DolnyProg, GornyProg) Values(1, 50) .... Insert Into Przedzialy(DolnyProg, GornyProg) Values(150, Null)
3. Zmodyfikuj zapytanie:
SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" FROM KLASYFIKACJA_CECHY_ZMIENNEJ As K Inner Join Przedzialy As P On K >= P.DolnyProg And (K < P.GornyProg Or P.GornyProg Is Null)
Teraz do woli mozesz sobie manipulowac przedzialami. W przyszlosci mozesz zrezygnowac z pewnej nadmiarowosci jaka jest podawanie dolnego i górnego progu, co tylko wiaze sie z ryzykiem powstania przedzialów zazebiajacych sie lub pomininiecia czesci danych. Mozesz wiec oprzec sie tylko na dolnym progu, jednak bedziesz musial rozbudowac powyzsze zapyanie.
Pozdrawiam Grzegorz
bebop - 26-03-2006 00:21
Grzegorz Danowski wrote:
(...) dzieki Gregorz za wskazowke :o) do pelni szczescia brakowalo jedynie grupowania (zapytanie laczylo wszystkie przedzialy)
SELECT MIN(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) ||' - ' || MAX (ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) PRZEDZIAL, COUNT(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) LICZEBNOSC, MAX(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "GRANICA PRZEDZIALU", AVG(ILOSC_OSOB_W_PRZEDSIEBIORSTWIE) "SREDNIA W PRZEDZIALE" FROM KLASYFIKACJA_CECHY_ZMIENNEJ K, PRZEDZIALY P WHERE K.ILOSC_OSOB_W_PRZEDSIEBIORSTWIE >= P.DOLNYPROG AND K.ILOSC_OSOB_W_PRZEDSIEBIORSTWIE < P.GORNYPROG GROUP BY P.GORNYPROG
-- pozdrawiam Piotrek
Romek - 29-03-2006 00:26
Nie wnikając w tresc selecta, sposoby rozwązania tego problemu za podrecznikami:)
1. Tablka Cecha_grade
war gora doł 1 0 50 2 51 60 3 61 70
select 'lista agregatów' from cecha_grade c, moja_tabela m where m.cecha between c.dol and c.gora group by c.war
2. select 'lista agregatów' from moja_tabela m group by tranc(stała * m.cecha, poziom zakraglania) - jezeli pozomy grupwania o satlym rozstepie (za pomoca mnozenia przez stale kazdy mozna uzyskac odwolne stale przedzialy)
3. zmine rozstepy tu juz gorzej ( trzeba dobrac odpowiednie przeksztalcenie) select 'lista agregatów' from moja_tabela m group by tranc( funkcja(m.cecha), poziom zakraglania)
funkcja - log(), sqrt(), nlog(n), power(cecha, potega)
lub jakies inne wymazone:)
pozrdrawiam romek
bebop - 04-04-2006 01:48
Romek wrote:
> select 'lista agregatów' > from moja_tabela m > group by tranc(stała * m.cecha, poziom zakraglania) > - jezeli pozomy grupwania o satlym rozstepie > (za pomoca mnozenia przez stale kazdy mozna uzyskac odwolne stale > przedzialy) Dzieki Romek,to bardzo cenna uwaga :)
> 3. zmine rozstepy tu juz gorzej ( trzeba dobrac odpowiednie przeksztalcenie) > select 'lista agregatów' > from moja_tabela m > group by tranc( funkcja(m.cecha), poziom zakraglania) > > funkcja - log(), sqrt(), nlog(n), power(cecha, potega) > > lub jakies inne wymazone:) wywazone ;)
-- pozdropit 'uwazam odpowiedz za uzyteczna w 10%'
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
=?iso-8859-2?q?Grupowanie_-_naj=B6wie=BFsze_stany_z_czujnik=F3w?=
PLSQL ORACLE grupowanie po dacie(rok-m-c-dzien-godzina)
=?iso-8859-2?q?[mysql]_Grupowanie_rekord=F3w_wg_dat?=
count(*), jak pokazać wiersze bez wartości przy grupowaniu
[PGSQL] Pobranie danych z kilu tabel i grupowanie
Grupowanie =?ISO-8859-2?Q?wynik=F3w_=5Bsql=5D?=
MySQL - kwerenda krzyzowa lub grupowanie na dwoch poziomach
[mysql] sortowanie-grupowanie hierarchicznych danych
[mysql] grupowanie danych w jednej tabeli
zanotowane.pldoc.pisz.plpdf.pisz.platanvarne633.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|