[ miličić.marko @ 23.03.2007. 21:31 ] @
Evo jos jedne SQL mozgalice. Nadam se da ce privuci paznju SQL majstora


Prica:

U jednoj tablei imamo pacijente. Svaki pacijent ima ime i prezime, id i

frekvenciju preporucenih poseta lekara.

PACIJENTI
ID|IME I PREZIME|FREKVENCIJA|CESCE
----------------------------------
01|PERA PERIC |3 dana |da
02|MIKA MIKIC |7 dana |ne
03|LAZA LAZIC |10 dana |ne
04|SIMA SIMIC |2 dana |ne


Lekar uredno vodi evidenciju posete pacijenata

OBILASCI
ID|PACIJENT_ID|DATUM
-------------------------
01|01 |2006-12-01
02|01 |2006-12-02
03|04 |2006-12-03



Napisati SQL query koji ce lekaru omoguciti da ne zapostavlja svoje

pacijente, ali i da ga spreci da pacijente obilazi cesce nego sto je

potrebno. Dakle izvrsavanjem querija lekar treba da dobije ime i prezime

pacijenta koga sledeceg treba da obidje.


Zahtevi:
1. Lekar moze imati proizvoljno mnogo pacijenata
2. Lekar na pocetku nema podatke tj. ni jedan zapis u tabeli OBILASCI
2. Lekar ne sme obilaziti pacijente cesce nego sto je potrebno sem ukoliko pacijent to ne zahteva (kolona cesce)
3. Lekar je veoma precizan i pamti obilaske sa rezolucijom od 10 minuta
4. Lekar je 'fer' i ukoliko u nekom danu treba da obidje nekoliko

pacijenata uvek odabere najbolji moguci redosled tako da svi pacijenti
budu obsluzeni 'fer' redosledu.




a da... lekar ima tacan sat koji koristi ukucavanjem SQL funkcije NOW()
[ chachka @ 24.03.2007. 21:17 ] @
Koliko poseta lekar moze da obavi u jednom danu? Koliko traje jedna poseta?
[ miličić.marko @ 25.03.2007. 01:07 ] @
Nema ograncenja. Koliko god puta stisne enter (izvrsi query) query uvek mora da bude u pravu. Dakle, ako nema nikog da poseti query vrati prazan resultset. A ako ima onda vrati onog pacijenta sa najvecim prioritetom.
[ goranvuc @ 25.03.2007. 08:54 ] @
Bojim se da ces imati malo konkretnih odgovora; Suvise je proizvoljnosti u postavci problema, a vecina nas voli jasno definisan, precizan i konkretan problem, a ne da se pretpostavlja gomila nekih stvari. Meni licno nije jasan taj "nulti" momenat, tj nigde ne postoji datum poslednjeg obilaska pacijenta, ili se mozda pretpostavlja da niko od njih jos nije posecen, sto onda dovodi do pitanja jednoznacnosti redosleda ako u tom "nultom" danu postoji vise njih kojima je frekvencija 1 dan, pa onda i pitanje koje je postavio chachka postaje neizbezno i zahteva odgovor.

Dakle, ne vidim da ovako definisan problem moze da se resi tako kako ti predlazes (a narocito ne vidim kakve veze ima ENTER taster sa SQL problemom)
[ miličić.marko @ 26.03.2007. 22:17 ] @
1. Enter taster je trebao da docara jednostavnost querija. Dakle query nije ninakoji nacin parametrizovan.

2. Upravo je poenta u tom nultom momentu. Dakle lekar pocinje sa radom kada u svojoj evidenciji nema ni jedan obilazak.

3. Ovo je na neki nacin specijalizacija generalnog algoritma za obsluzivanje redova cekanja... Dakle treba napraviti automat koji ima definisan odgovor u svakom trenutku. Generalno gledano, problem se i moze resiti projektovanjem konacnog automata sa zadatim stanjima i prelazima, a kasnije to portovati na sintaksu SQL jezika.

M
[ goranvuc @ 27.03.2007. 00:53 ] @
OK, ja sam tebe pitao sledece:

Ako imamo u "nultom" momentu ovo:

PACIJENTI
ID|IME I PREZIME|FREKVENCIJA|CESCE
----------------------------------
01|PERA PERIC |1 dan |da
02|MIKA MIKIC |7 dana |ne
03|LAZA LAZIC |10 dana |ne
04|SIMA SIMIC |2 dana |ne
05|MIRA PERIC |3 dana |da
06|DJOKA MIKIC |1 dan |da
07|TOZA LAZIC |1 dan |da
08|FEMA SIMIC |5 dana |ne

Kod koga prvog doktor treba da ide po tebi, posto ih ima 3 "za odmah"? Kako to moze biti jednoznacno, tj ko po tebi ovde ima najveci prioritet od njih trojice? onaj ko da vise para? I sta kada ih ima 60 takvih, a poseta traje bar pola sata? Mission impossible?

Dakle, duzan si da navedes ogranicenja kojih ocigledno mora biti da bi zadatak uopste imao smisla.

Pozdrav!
[ miličić.marko @ 28.03.2007. 22:01 ] @
Hvala na sugestiji i pitanju.


U slucaju da ima vise pacijenata sa istim prioritetom, da bi doktor bio fer odabace nasumice... koristeci RAND() ali samo u prvom prvom trnutku kada je njegova arhiva o posetama prazna. Svaki sledeci put ce moci da odabere pacijenta koji je najduze cekao (makar za nekoliko sekundi) i otici kod njega.

Samo da naglasim, ne radi se 'real-time' sistemu da moramo imati apsolutno besprekornu frekvenciju po kojoj neki pacijent ima pristup deljivom resursu (lekaru). Dovoljno je napraviti algoritam za odabir korisnika koji ce opsluzivati korisnike (pacijente) fer i korektno u granici mogucnosti lekara. Dakle, cak i ako lekar kasni 10 dana (prebukran) korisnici nece izgubiti svoj prioritet u redu za cekanje.


U slicaju prebukiranosti ('mission impossible') lekar ce zaposliti pomocnika i o obojica ce koristi isti algoritam, samo sto ce ovoga puta 'kapacitet' biti veci.


[ chachka @ 02.04.2007. 14:15 ] @
S obzirom da niko nije dao resenje ove mozgalice (cak mi se cini da je niko nije ni razumeo), apelujem na autora da prezentuje resenje. Mozda ce tada biti jasnije sta treba uraditi.

PS: Po meni je ovo obican ORDER BY uz spajanje dve tabele i eventualno grupisanje.
[ Zidar @ 02.04.2007. 14:30 ] @
Predlazem da ubuduce pri postavljanju mozgalice autor odmah objavi da li ima sopstveno resenje, ma kakvo bilo, ili ne. Ne mra odmah da objavi resenja, ali posle dan dva trebalo bi da autor kaze 'evo kako sam ja to zamislio', pa makar i ne radilo 100% kakao treba. Cisto da ne bi neko optuzio autora da hoce da mu se uradi zadatak. Kao sto mene jedan optuzi za jednu od pocetnih mozgalica