pytanko z instrukcje MYSQL
Rafal - 06-05-2006 00:07
pytanko z instrukcje MYSQL
mam dla przykladu maly wycinek danych z bazy:
+--------+---------------------+-------------+ | symbol | data | czynnosc | +--------+---------------------+-------------+ | PZ254 | 2006-05-05 07:21:31 | Rozpoczecie | | PZ254 | 2006-05-05 08:03:26 | Zakonczenie | | PZ254 | 2006-05-05 08:03:54 | Rozpoczecie | | PZ254 | 2006-05-05 08:23:54 | Przerwanie | | PZ250B | 2006-05-05 09:07:32 | Rozpoczecie | | PZ250B | 2006-05-05 09:43:31 | Przerwanie | +--------+---------------------+-------------+
chciabym wyselekcjonowac ostatnia czynnosc dla danego symbolu probowalem np. tak: SELECT symbol,max(data),max(czynnosc) FROM praca GROUP BY symbol; efekt jest nieprawidlowy: +--------+---------------------+---------------+ | symbol | max(data) | max(czynnosc) | +--------+---------------------+---------------+ | PZ250B | 2006-05-05 09:43:31 | Rozpoczecie | | PZ254 | 2006-05-05 08:23:54 | Zakonczenie | +--------+---------------------+---------------+
prosze o pomoc jak skonstruowac instrukcje SELECT aby pojawiala sie czynnosc, ta na prawo od daty
------------------------------------------ jest mi to potrzebne do optymalizacji, bo na razie zrobilem selecje posrednio przez tablice tymczasowe, ale danych jest tak duzo ze oblicza mi sie to kilka minut, i chcialbym wszystko upchnac w jednej instrukcji
gonzak@op.pl - 06-05-2006 00:07
>chciabym wyselekcjonowac ostatnia czynnosc dla danego symbolu >probowalem np. tak: >SELECT symbol,max(data),max(czynnosc) FROM praca GROUP BY symbol; >efekt jest nieprawidlowy:
moze cos w rodzaju takiego select * from (select * from praca where <np symbol=xxxx> order by data desc) as t group by symbol
tyle ze to subquery dla mysql>4.0
pozdr Rafal 8sxat) -- Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych
Rafal - 06-05-2006 00:07
chyba nie o to chodzi musialbym wtedy dla kazdego symbolu wykonac osobna instrukcje SELECT a to przedluza obliczenia :((((
chce w jednej instrukcji wyselekcjonowac wiersze z ostatnia czynnoscia dla kazdego symbolu
jest mnostwo symboli i dla kazdego symbolu powienien sie pokazac jeden wiersz z ostatnia data i czynnoscia
moze inne pomysly ?
mam MySQL wersja 4.14
Grzegorz Danowski - 06-05-2006 00:07
Użytkownik "Rafal" <rcU5UN4O@pulsarsc.com.pl> napisał w wiadomości news:e3f2hj$i1s$1@nemesis.news.tpi.pl... > mam dla przykladu maly wycinek danych z bazy: > > +--------+---------------------+-------------+ > | symbol | data | czynnosc | > +--------+---------------------+-------------+ > | PZ254 | 2006-05-05 07:21:31 | Rozpoczecie | > | PZ254 | 2006-05-05 08:03:26 | Zakonczenie | > | PZ254 | 2006-05-05 08:03:54 | Rozpoczecie | > | PZ254 | 2006-05-05 08:23:54 | Przerwanie | > | PZ250B | 2006-05-05 09:07:32 | Rozpoczecie | > | PZ250B | 2006-05-05 09:43:31 | Przerwanie | > +--------+---------------------+-------------+ > > chciabym wyselekcjonowac ostatnia czynnosc dla danego symbolu
Spróbuj tak:
Select * From praca As P Where Exists( Select * -- jeśli nie będzie działać, to zmień * na 1 From praca As M Where M.symbol = P.symbol Having Max(M.data) = P.data)
Pozdrawiam Grzegorz
Rafal - 06-05-2006 00:07
wielkie dzieki sposob w jaki to skonstruowales natchnal mnie nowymi pomyslami i juz kombinuje nowy algorytm
pozdrawiam
Rafal - 06-05-2006 00:07
cienko to wiedze, zrobilem tym sposobem analize dla jednego zlecenia produkcyjnego i pod wynikiem wypisal sie czas: "5 rows in set (25.55 sec)"
zlecen mam juz ze 2 tysiace od poczatku roku
algorytm ten dziala chyba tak ze dla kazdego wiersza nadrzednej funkcji uruchamia podfunkcję (podselekt) i sprawdza warunki
jest jakas szybsza metoda ?
Grzegorz Danowski - 06-05-2006 00:07
Użytkownik "Rafal" <rcU5UN4O@pulsarsc.com.pl> napisał w wiadomości news:e3fdsr$q53$1@nemesis.news.tpi.pl... > cienko to wiedze, > zrobilem tym sposobem analize dla jednego zlecenia produkcyjnego > i pod wynikiem wypisal sie czas: > "5 rows in set (25.55 sec)" > > zlecen mam juz ze 2 tysiace od poczatku roku > > algorytm ten dziala chyba tak ze dla kazdego wiersza nadrzednej funkcji > uruchamia podfunkcję (podselekt) i sprawdza warunki > > jest jakas szybsza metoda ?
Na SQL Serverze działa spoko, skoro działa wolno to spróbuj inaczej:
Select * From praca As P Inner Join (Select symbol, Max(Data) As MaxData From praca Group By symbol) As M On M.MaxData = P.data
Pozdrawiam Grzegorz
Grzegorz Danowski - 06-05-2006 00:07
Użytkownik "Grzegorz Danowski" <gdn__na@serwerze__poczta.onet.pl> napisał w wiadomości news:e3fe33$si8$1@inews.gazeta.pl... > Użytkownik "Rafal" <rcU5UN4O@pulsarsc.com.pl> napisał w wiadomości > news:e3fdsr$q53$1@nemesis.news.tpi.pl... >> cienko to wiedze, >> zrobilem tym sposobem analize dla jednego zlecenia produkcyjnego >> i pod wynikiem wypisal sie czas: >> "5 rows in set (25.55 sec)" >> >> zlecen mam juz ze 2 tysiace od poczatku roku >> >> algorytm ten dziala chyba tak ze dla kazdego wiersza nadrzednej funkcji >> uruchamia podfunkcję (podselekt) i sprawdza warunki >> >> jest jakas szybsza metoda ? > > Na SQL Serverze działa spoko, skoro działa wolno to spróbuj inaczej: > > Select > * > From > praca As P > Inner Join > (Select > symbol, > Max(Data) As MaxData > From > praca > Group By > symbol) As M > On > M.MaxData = P.data
Poprawka:
.... On M.symbol = P.symbol And M.MaxData = P.data
G.
Tygrys - 06-05-2006 00:07
Użytkownik "Rafal" <rcU5UN4O@pulsarsc.com.pl> napisał w wiadomości news:e3fdsr$q53$1@nemesis.news.tpi.pl... > cienko to wiedze, > zrobilem tym sposobem analize dla jednego zlecenia produkcyjnego > i pod wynikiem wypisal sie czas: > "5 rows in set (25.55 sec)" > > zlecen mam juz ze 2 tysiace od poczatku roku > > algorytm ten dziala chyba tak ze dla kazdego wiersza nadrzednej funkcji > uruchamia podfunkcję (podselekt) i sprawdza warunki > > jest jakas szybsza metoda ?
Chyba nie, bo dla każdego symbolu musisz obliczyć max datę (1) a potem wyświetlić dla niego dane (2)
Coś jak: SELECT P1.symbol, P1.data, P1.czynnosc FROM praca P1 WHERE P1.data = (SELECT max(Data) FROM praca P2 WHERE P1.symbol = P2.symbol)
Powinno być w miarę szybkie.
Pozdrawiam, Tygrys
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plchinska-zupka.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 |
|