Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla

[es] :: Baze podataka :: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla

[ Pregleda: 5411 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla20.04.2007. u 22:27 - pre 206 meseci
Tema Pokusaj spajanja upita operatorom union. sa ovog podforuma me je navela na sledecu mozgalicu.

Uvodna napomena Posto se u mozgalici koristi datum i vreme, moze doci do nekompatibilnosti izmedju raznih sistema za upravljanje bazama podataka. Ja sam u mozgalici upotrebio TIMESTAMP tip podataka koji u PostgreSQL-u obuhvata zajedno i datum i vreme. Slobodno promenite ovaj tip u vama odgovarajuci ili cak podelite ovu kolonu na dve (posebno datum, a posebno vreme) ako to vas sistem zahteva.


Imamo jednu firmu. Svi radnici imaju identifikacione kartice. Svaka kartica ima svoj jedinstveni identifikacioni broj. Radnici pri svakom ulasku i pri svakom izlasku iz firme svoju karticu provlace kroz citac kartica. Citac kartica kao rezultat citanja daje samo dve informacije:
1. identifikacioni broj kartice,
2. tacan datum i vreme provlacenja kartice.
Zbog pojednostavljenja cemo predpostaviti da radnici ne mogu napustati radno mesto u toku dana. Znaci, kada se jednom odjave zavrsili su posao za taj dan.
Recimo da smo iz citaca kartice dobili sledeci niz informacija:
Code:

ibk   vreme
---   -------------------
  1   2007-04-19 06:55:00
  2   2007-04-19 06:57:00
  3   2007-04-19 07:01:00
  1   2007-04-19 14:00:00
  3   2007-04-19 15:01:00
  2   2007-04-19 15:12:00
---   -------------------
  3   2007-04-20 06:57:00
  2   2007-04-20 06:58:00
  1   2007-04-20 06:59:00
  2   2007-04-20 15:01:00
  1   2007-04-20 15:02:00
  3   2007-04-20 15:03:00
---   -------------------
  1   2007-04-21 06:51:00
  2   2007-04-21 08:13:00
  3   2007-04-21 07:02:00
  1   2007-04-21 14:59:00
  3   2007-04-21 15:01:00
  2   2007-04-21 17:20:00

Direktor firme zeli da dobije izvestaj o dolasku i odlasku s posla u sledecem obliku:
Code:

ibk   dolazak               odlazak               
---   -------------------   -------------------   
  1   2007-04-19 06:55:00   2007-04-19 14:00:00   
  1   2007-04-20 06:59:00   2007-04-20 15:02:00       
  1   2007-04-21 06:51:00   2007-04-21 14:59:00   
  2   2007-04-19 06:57:00   2007-04-19 15:12:00   
  2   2007-04-20 06:58:00   2007-04-20 15:01:00    
  2   2007-04-21 08:13:00   2007-04-21 17:20:00   
  3   2007-04-19 07:01:00   2007-04-19 15:01:00   
  3   2007-04-20 06:57:00   2007-04-20 15:03:00     
  3   2007-04-21 07:02:00   2007-04-21 15:01:00   

(Ovo je osnovni izvestaj. Kad imamo njega lako je praviti ostale izvestaje tipa: kasnjenje u minutima, trajanje radnog dana, duzina produzenog rada,...)

Znaci kao pocetak imamo jednu tabelu:
Code:

CREATE TABLE provlacenja (
  ibk INTEGER NOT NULL,
  vreme TIMESTAMP NOT NULL
);
i njene podatke:
Code:

INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-19 06:55:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-19 06:57:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-19 07:01:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-19 14:00:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-19 15:01:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-19 15:12:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-20 06:57:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-20 06:58:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-20 06:59:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-20 15:01:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-20 15:02:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-20 15:03:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-21 06:51:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-21 08:13:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-21 07:02:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-21 14:59:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-21 15:01:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-21 17:20:00');

Kao rezultat treba da se dobije gornji izvestaj. U resavanju se mogu koristi pomocne tabele, trigeri, procedure, sve sto vam padne na pamet. Bitno je doci do resenja :)

"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

goranvuc
Goran Vucicevic
Novi Sad

Član broj: 4934
Poruke: 1846
*.dialup.neobee.net.



+41 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla20.04.2007. u 23:02 - pre 206 meseci
Interesantan, lepo i precizno definisan zadatak (kad bi svi bili takvi ...)

Evo resenje u Accessu, jedino sto je egzoticno je konverzija vremena u datum preko DateSerial funkcije, tako da bi trebalo da radi i u drugim DBMS koristenjem adekvatne funkcije za konverziju.

Code:

SELECT dani.ibk, Dolazak, Odlazak
FROM ((SELECT ibk, DateSerial(Year(vreme), Month(vreme), Day(vreme)) AS Dan 
           FROM provlacenja 
           GROUP BY ibk, DateSerial(Year(vreme), Month(vreme), Day(vreme))) AS dani 
LEFT JOIN (SELECT MIN(vreme) AS Dolazak, DateSerial(Year(vreme), Month(vreme), Day(vreme)) AS Dan, ibk 
                FROM provlacenja 
                GROUP BY DateSerial(Year(vreme), Month(vreme), Day(vreme)), ibk) AS dolasci 
ON (dani.Dan = dolasci.Dan AND dani.ibk = dolasci.ibk)) 
LEFT JOIN (SELECT MAX(vreme) AS Odlazak, DateSerial(Year(vreme), Month(vreme), Day(vreme)) AS Dan, ibk 
                FROM provlacenja 
                GROUP BY DateSerial(Year(vreme), Month(vreme), Day(vreme)), ibk) AS odlasci 
ON (dani.Dan = odlasci.Dan AND dani.ibk = odlasci.ibk)

Dakle, sustina je u povezivanju upita koji sadrzi jedinstvene pojave kartica po danima sa dnevnim dolascima i dnevnim odlascima (min i max) naravno, sve preko zajednickog dana - opisno receno (mozda ne dovoljno slikovito). Ovo je samo jedna moguca varijanta, na pamet mi padaju bar jos 2 druga nacina, ali to ostavljam drugima.
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla21.04.2007. u 13:36 - pre 206 meseci
PostgreSQL 8.2:

Someone's sitting in the shade today because someone planted a tree a long time ago.
Prikačeni fajlovi
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla21.04.2007. u 14:35 - pre 206 meseci
Lepo, lepo :)

Koliko je lako iscitavati vreme dolaska i vreme odlaska pomocu jednog citaca! Pitam se zasto jedna firma koju posecujem ima dva citaca - jedan samo za prijavu, a jedan samo za odjavu :) Verovatno "programeri" koji su pravili taj sistem nisu znali za ovakve trikove.

Ajmo sada da ubacimo i trecu smenu (radnici koji dolaze uvece oko 23 a odlaze kuci sledeceg jutra oko 7):
Code:

INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-19 22:55:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-20 07:03:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-20 22:57:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-21 07:01:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-21 23:01:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-22 07:26:00');

I ocekivani izvestaj dolazaka i odlazaka bi sada trebao da izgleda
Code:

ibk   dolazak               odlazak               
---   -------------------   -------------------   
  1   2007-04-19 06:55:00   2007-04-19 14:00:00   
  1   2007-04-20 06:59:00   2007-04-20 15:02:00       
  1   2007-04-21 06:51:00   2007-04-21 14:59:00   
  2   2007-04-19 06:57:00   2007-04-19 15:12:00   
  2   2007-04-20 06:58:00   2007-04-20 15:01:00    
  2   2007-04-21 08:13:00   2007-04-21 17:20:00   
  3   2007-04-19 07:01:00   2007-04-19 15:01:00   
  3   2007-04-20 06:57:00   2007-04-20 15:03:00     
  3   2007-04-21 07:02:00   2007-04-21 15:01:00
  4   2007-04-19 22:55:00   2007-04-20 07:03:00
  4   2007-04-20 22:57:00   2007-04-21 07:01:00
  4   2007-04-21 23:01:00   2007-04-22 07:26:00

"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
212.103.132.*

ICQ: 174153511


+26 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla23.04.2007. u 07:44 - pre 206 meseci
malo si previše pojednostavio zadatak
jer da neko radi 8h na dan bez pauze,
to nemaš nigde i tu pretpostavku ne možeš uzeti u razmatranje

razlog,
neke firme imaju i čitače koje mere vreme između rada
što znači da radnik mora pre nego što ode na pauzu
da provuče karticu i kad se vrati, opet da provuče karticu

sad, ne znam jel provlači kad ide na wc ali recimo ako ide pa puš
pauzu, MORA. Eto dobrog sistema odvikavanja od pušenja
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla23.04.2007. u 09:52 - pre 206 meseci
@priki

Ako ti je zadatak jednostavan, što nisi postavio rešenje, te onda problem proširio sa:
Citat:

neke firme imaju i čitače koje mere vreme između rada što znači da radnik mora pre nego što ode na pauzu da provuče karticu i kad se vrati, opet da provuče karticu


BTW, prva poruka koju sam postovao je rezultat i iz MySQL 5.0. Ne bi bilo loše videti rešenje drugog problema.
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.suonline.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla23.04.2007. u 09:59 - pre 206 meseci
na zalost, zaista jesam previse uprostio mozgalicu. Nema veze, polako cu je usloznjavati. Vec je usloznjena sa ubacivanjem trece smene.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla23.04.2007. u 17:43 - pre 206 meseci
Evo jos jedno resenje u Accessu, slicno onome sto je Milos ponudio:
Code:

SELECT Format([vreme],"dd\.mm\.yyyy") AS DAtum
, provlacenja.ibk
, Min(provlacenja.vreme) AS Dolazak
, Max(provlacenja.vreme) AS Odlazak
FROM provlacenja
GROUP BY Format([vreme],"dd\.mm\.yyyy"), provlacenja.ibk;


Problem nije ejdnostavan kao sto se cini. Pisanje kverija jeste jednostavno, ali ne i zadatak. Svi kveriji koji su ponudjeni radice bez greske ako i samo ako vazi da svi radnici zaista provlace karticu tacno dva puta dnevno, ni manje ni vise

Ako se neko razboli pa ga odveze hitna pomoc pre kraja radnog vremena, pa ne moze da provuce karticu na odlasku, imace samo vreme dolaska. Moze neko da provuce karticu dva puta uzastopce, na ulazu ili na izlazu. Svi ponudjeni kveriji ce javiti da je vreme dolaska i odlaska isto. Onda ce onaj ko pravi reporte morati o tome da vodi racuna. Neko moze da zaboravi da provuce karticu ujutru, a da je provuce poslepodne. Ista stvar. Moralo bi dakle da postoji paran broj provlacenja za svakog radnika da bi kveri dao korektne rezultate. E, takav kveri se vec komplikuje. Ako hocemo da nekako naznacimo problematicne slucajeve u izlaznom kveriju, mozemo da modifikujemo malo gornji Access kveri, ovako:

Code:

SELECT Format([vreme],"dd\.mm\.yyyy") AS DAtum, provlacenja.ibk, Min(provlacenja.vreme) AS Dolazak, Max(provlacenja.vreme) AS Odlazak, Count(provlacenja.vreme) AS CountOfvreme
FROM provlacenja
GROUP BY Format([vreme],"dd\.mm\.yyyy"), provlacenja.ibk;

sad vidimo i koliko puta je neko provukao karticu u toku dana. U mom slucaju je bilo ovako:
DAtum ibk Dolazak Odlazak CountOfvreme
19.04.2007 1 19/04/2007 6:55:00 AM 19/04/2007 2:01:00 PM 3
19.04.2007 2 19/04/2007 6:57:00 AM 19/04/2007 2:01:00 PM 2
19.04.2007 3 19/04/2007 7:01:00 AM 19/04/2007 2:11:00 PM 3
20.04.2007 1 20/04/2007 6:00:00 AM 20/04/2007 2:00:00 PM 2
20.04.2007 2 20/04/2007 6:57:00 AM 20/04/2007 2:01:00 PM 2
20.04.2007 3 20/04/2007 7:01:00 AM 20/04/2007 2:10:00 PM 2
21.04.2007 1 21/04/2007 7:00:00 AM 21/04/2007 2:00:00 PM 2
21.04.2007 2 21/04/2007 6:57:00 AM 21/04/2007 2:01:00 PM 2
21.04.2007 3 21/04/2007 7:01:00 AM 21/04/2007 2:10:00 PM 2
22.04.2007 1 22/04/2007 6:55:00 AM 22/04/2007 2:55:00 PM 2
22.04.2007 2 22/04/2007 6:57:00 AM 22/04/2007 6:57:00 AM 1
22.04.2007 3 22/04/2007 7:01:00 AM 22/04/2007 3:01:00 PM 2

Sad onaj ko izdaje izvestaj moze da vidi da nesto nije u redu, gde god je CountOfVreme<>2
Ako zelite da umesto brojeva prikazete tekst, kveri bi se jos malo zakomplikovao, ali to nie cilj rasprave. cilj je da se pokaze kako naoko jednostavna stvar zacas poraste

Mozda oni sto su rastavili sistem na ulazni i izlazni kompjuter i nisu bas mnogo pogresili. barem se zna koje provlacenje je imalo koju svrhu. U sistemu sa jednim kompjuterom nikad ne znas zasigurno da li je u pitanju ulaz ili izlaz. Kad imas odvojene masine, odna se za svako provlacenje upise i kod U ili I za ulaz/izlaz. Onda se kveriji komplikuju. Za svaki izlaz tmorate da trazite ulaz koji ima najveci moguci datum pre izlaza. I opet nista ne pomaze ako se neko ne otkuca na izlazu. Onda ce sledeci izlaz koji se unese u tabelu pokazivati na poslednji ulaz, ali ce pretposlednji ulaz biti nevidljiv za kveri - nece biti ni jedn izlaz koji vidi taj ulaz. Znaci mora se obezbediti da svaki ulaz pokaze jedan izlaz i obrnuto. Tesko da se prati? Jeste, cak i kad bi nacrtali.

Tek toliko o jednostavnom problemu

Zidareva druga teorema "Nista sto u sebi sadrzi vremensku komponentu ne moze da bude jednostavno. Moze samo da izgleda jednostavno na prvi pogled (Mozgalica 7) ili vec na startu da izgleda strasno (ono od Srdjana za NZ o restoranu i gostima)
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla24.04.2007. u 13:08 - pre 206 meseci
@chachka
Koliko vidim, mozgalica uopšte nije laka.
Mislim da to što tražiš se ne može tako odraditi, stoga u tabelu sam uveo još jedan atribut "radniDan", po kojem se prate
smene.
Code:

-- tabela provlacenja
CREATE TABLE provlacenja (
 ibk INTEGER NOT NULL,
 radniDan TIMESTAMP NOT NULL,
 vreme TIMESTAMP NOT NULL
);
 
-- punjenje tabele
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  1, '2007-04-19', '2007-04-20 06:57:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  1, '2007-04-19', '2007-04-20 15:00:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  1, '2007-04-20', '2007-04-20 06:59:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  1, '2007-04-20', '2007-04-20 15:02:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  1, '2007-04-21', '2007-04-21 06:51:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  1, '2007-04-21', '2007-04-21 14:59:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  2, '2007-04-20', '2007-04-20 06:58:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  2, '2007-04-20', '2007-04-20 15:01:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  2, '2007-04-21', '2007-04-21 08:13:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  2, '2007-04-21', '2007-04-21 17:20:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  3, '2007-04-20', '2007-04-20 06:03:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  3, '2007-04-20', '2007-04-20 14:59:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  3, '2007-04-21', '2007-04-21 07:02:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  3, '2007-04-21', '2007-04-21 15:01:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  4, '2007-04-19', '2007-04-19 22:55:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  4, '2007-04-19', '2007-04-20 07:03:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  4, '2007-04-20', '2007-04-20 22:57:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  4, '2007-04-20', '2007-04-21 07:01:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  4, '2007-04-21', '2007-04-21 23:01:00');
INSERT INTO provlacenja (ibk, radniDan, vreme) VALUES (  4, '2007-04-21', '2007-04-22 07:26:00');

-- upit nad tabelom
SELECT ibk,MIN(vreme) AS Dolazak,  MAX(vreme) AS Odlazak
FROM provlacenja
WHERE
  radniDan = '2007-04-19'
GROUP BY  ibk
ORDER BY  ibk

PostgreSQL 8.2:



BTW, ne mogu otvoriti ES nešto ovih dana, te kasnim sa odgovorom, a i trebalo mi je vremena.






[Ovu poruku je menjao Miloš Baić dana 24.04.2007. u 16:04 GMT+1]
Someone's sitting in the shade today because someone planted a tree a long time ago.
Prikačeni fajlovi
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.suonline.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla24.04.2007. u 14:17 - pre 206 meseci
@milos: Ok je to sto si prosirio tabelu sa dodatnom kolonom 'radniDan'. Jedino mi nije jasno - odakle ti podaci koji se ubacuju u tu kolonu?
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla24.04.2007. u 14:30 - pre 206 meseci
Miloseva ideja sa dodavanjem novog atributa 'Radni Dan' takodje ukazuje na ono resenje sa dva kompjutera - jedan za ulaz, jedan za izlaz. Kad znas sta je ulaz, bas te briga za radni dan. Stos je da uparis ulaz i izlaz a da ne izgubis nista. Bez dva kompjutera, Chachka je u pravu - kako ce se uneti 'Radni Dan'

Sistemi sa provlacenjem kartica inace ne funkcionisu kako treba ama bas nigde. Jedino gde se priblizavaju razumnoj tacnosti jets slucaj kad kartica bukvalno otvara vrata. Onda imas opet dav kompjutera, po jedan na svakoj strani vrata. Onda se tacno zna ko je kad usao i ko je kad izasao. Osim ako jedna osoba ne provuce karticu, a dve ili vise njih prodju kroz vrata.

Da se ne zamajavamo real life problemima koji su u sustini izvan domena baza podataka. Pretpostavimo da imamo idealan slucaj - svaki ulaz pokriven je izlazom. Ako je ovo tacno, eno pokazali smo resenja za jednu smenu (dolazak ujutru, odlazak posle podne). Sad ce da pokusam da uradim ono pod B) - radnici dolaze u 23:00 da rade a odlaze u 6:00, mislim u sledecem postu.

:-)
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla24.04.2007. u 19:37 - pre 206 meseci
Evo kako moze u Accessu da se resi problem prikazivana dolazaka i odlazaka, cak i kada imamo smene koje pocinju pre ponoci a zavrsavaju sutradan ujutru. Pretpostavka je da su podaci cisti, a to znaci da za svaki dolazak na posao postoji i odlazak za svakog coveka. To podrazumeva da je prvi zapis sza svakoga upravo dolazak na posao. Ako je ovo tacno onda sledi resenje za Access, koje ej prikazano u zakacenom fajlu:

1. Ako poredjamo sve dogadjaje po parametru Vreme, i dodelimo tim dogadjajima redne brojeve, videcete da su dolasci neparni brojevi, a odlasci parni brojevi. Redni brojevi nisu ni slucajno neki autonumber ili slicno, nikako, redne brojeve izracunava kveri, po pravilu: (ORDER BY ibk, vreme) , vidi kveri qryDveSmene_Redosled

2. Ako posmatrate rezultat koji vraca kveri qryDveSmene_Redosled, uocicete da se dolazak i odgovarajuci odlazak razlikuju tacno za 1. Dalje je lako - napravimo kveri koji vraca samo dolaske (WHERE Redosled je neparan broj, upotrebljena MOD funkcija), vidi kveri qryDveSmene_Dolazak.

3. Onda napravimo kveri koji vraca samo odlaske - qryDveSmene_Odlazak. Uocite polje RedosledOdlaska i kako je ono izracunato - RedosledOdlaska = qryDveSmene_Redosled.Redosled-1

4. Na kraju napravimo JOIN izmedju qryDveSmene_Dolazak i qryDveSmene_Odlazak. Pogledajte kolone po kojima cinimo JOIN i razumecete zasto smo u koraku 3. izracunali RedosledOdlaska bas onako. Postoje i drugi nacini da se JOIN izvede, ali jse moj Access 2003 bunio da je 'Query too complex'

Ovo naravno moze da se strpa u jedan monstrum kveri koji niko zivi ne bi bio u stanju da procita niti razume, pa sam namerno izabrao nacin sa nekoliko 'kaskadnih' kverija. kad bi Access imao lep SQL editor, verovatno bi se cela prica mogla strapati u jedna kveri, koji bi cak mozda bio i citljiv i razumljiv. U svakom slucaju, bitna je ideja, verovatno moze da se izvede u vecini sistema. Ovde je srz ideje da se upotrebe redni brojevi za dogadjaje koji su zabelezeni i da se na osnovu toga odredi sta je odlazak a sta dolazak i koji odlazak odgovara kom dolasku.

:-)
Prikačeni fajlovi
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla24.04.2007. u 21:22 - pre 206 meseci
Poenta i mog resenja je prebrojavanje dogadjaja. Moje resenje se razlikuje u tome sto sam ja DIV (rezultat celobrojnog delenja) i MOD (ostatk celobrojnog delenja) iskoristio za dobijanje rednog broja dana u kom se zbio par dogadjaja dolazak/odlazak.

Moje resenje je testirano na PostgreSQL-u 8.1

Zbog jednostavnosti cu kreirati jedan pogled:
Code:

CREATE VIEW razvrstavanja_provlacenja
  (ibk, vreme, rbr)
AS
SELECT p1.ibk,
       p1.vreme,
       COUNT(p2.ibk)/2  +  MOD(COUNT(p2.ibk), 2) AS rbr
  FROM provlacenja AS p1
       INNER JOIN
       provlacenja AS p2
         ON p1.ibk = p2.ibk
        AND p1.vreme >= p2.vreme
 GROUP BY p1.ibk, p1.vreme

U ovom pogledu znak / oznacava celobrojno delenje (DIV) a funkcija MOD naravno vraca ostatak celobrojnog delenja. Da bi VIEW proradio na ostalim sistemima treba obratiti paznju na ove dve stvari da se adekvatno zamene.
Poenta ovog VIEW-a je prebrojavanje dana (tacnije radnih dana) pri cemu je iskorisceno da se u jednom danu desavaju tacno dva dogadjaja: dolazak i odlazak. Otuda dolazi 2 pri upotrebi DIV-a i MOD-a.
Sledeci upit jednostavno poziva gornji VIEW i daje trazeni rezultat:
Code:

SELECT ibk, rbr, MIN(vreme), MAX(vreme)
  FROM razvrstavanja_provlacenja
 GROUP BY ibk, rbr
 ORDER BY ibk, rbr


Edit: sređivanje teme.

[Ovu poruku je menjao chachka dana 02.09.2007. u 01:58 GMT+1]
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla24.04.2007. u 22:52 - pre 206 meseci
@chachka
Napokon.
Da li se ova mozgalica završava ovim:


Edit: Sređivanje teme.

[Ovu poruku je menjao chachka dana 02.09.2007. u 01:59 GMT+1]
Someone's sitting in the shade today because someone planted a tree a long time ago.
Prikačeni fajlovi
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.suonline.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla25.04.2007. u 10:25 - pre 206 meseci
Ovde ne mora biti kraj mozgalice.

Recimo da se iz nekog razloga radnici moraju overiti jedanput u toku radnog vremena. Overavanje se takodje obavlja provlacenjem kartice, pa imamo sledece ulazne podatke:
Code:

INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-19 10:11:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-19 11:23:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-19 11:24:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-20 04:00:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-20 09:55:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-20 10:12:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-20 13:21:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-20 23:55:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  1,   '2007-04-21 10:00:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  3,   '2007-04-21 10:14:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  2,   '2007-04-21 11:48:00');
INSERT INTO provlacenja (ibk, vreme) VALUES (  4,   '2007-04-22 03:37:00');

Ocekivani izlaz sacinjava jos jedna kolona 'overa' izmedju kolone dolaska i kolone odlaska, poput:
Code:

ibk   dolazak               overa                 odlazak               
---   -------------------   -------------------   -------------------   
  1   2007-04-19 06:55:00   2007-04-19 10:11:00   2007-04-19 14:00:00   
  1   2007-04-20 06:59:00   2007-04-20 10:12:00   2007-04-20 15:02:00
  1   2007-04-21 06:51:00   2007-04-21 10:00:00   2007-04-21 14:59:00
  2   2007-04-19 06:57:00   2007-04-19 11:23:00   2007-04-19 15:12:00
  2   2007-04-20 06:58:00   2007-04-20 09:55:00   2007-04-20 15:01:00
  2   2007-04-21 08:13:00   2007-04-21 11:48:00   2007-04-21 17:20:00
  3   2007-04-19 07:01:00   2007-04-19 11:24:00   2007-04-19 15:01:00
  3   2007-04-20 06:57:00   2007-04-20 13:21:00   2007-04-20 15:03:00
  3   2007-04-21 07:02:00   2007-04-21 10:14:00   2007-04-21 15:01:00
  4   2007-04-19 22:55:00   2007-04-20 04:00:00   2007-04-20 07:03:00
  4   2007-04-20 22:57:00   2007-04-20 23:55:00   2007-04-21 07:01:00
  4   2007-04-21 23:01:00   2007-04-22 03:37:00   2007-04-22 07:26:00

Resenje ovog problema je samo varijacija predhodnog resenja, gde svaki radni dan ima tri dogadjaja dolazak-overa-odlazak. Iako jos nismo videli Zidarevo resenje mislim da je njegovo resenje veoma lako prilagoditi ovom problemu sa overavanjem.

PS: Ovakva resenja uopste ne moraju biti performance-friendly, ali mogu posluziti kao osnova za popunjavanje tabele koja u sebi vec ima razdvojene dogadjaje po kolonama.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla25.04.2007. u 14:56 - pre 206 meseci
Fajl zakacen na prethodnu poruku Izvinjavam se za cekanje. Zurio sam kuci pa nisam video da li je proslo, a nesto s ebilo zakocilo, i tako...

Nisam probao ono sa jos jednim provlacenjem, izmedju odlaska i dolaska, ali verujem da bi neka deljivost sa 3, pa racunanje ostatka doveli do zadovoljavajuceg medjukverija.

Napominjem da je moje resenje obuhvatilo i nocnu smenu (vidi radnik broj 4). Mislim da nocna smena ne bi radila sa MIN,MAX. MIN/MAX resenje se zasniva na pretpostavci da su i dolazak i odlazak u istom danu, sto nije slucaj za nocnu smenu. Ili gresim, nisam imao mnogo vremena da pogledam resenje. U zakacenom fajlu ima i resenje sa MIN/MAX (qry..Simple)



 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla27.04.2007. u 18:40 - pre 206 meseci
Evo i resenja mozgalice. Resenje je testirano na PostgreSQL-u.

Prvo cu kreirati pogled:
Code:

CREATE VIEW razvrstavanja_provlacenja_3(
    ibk,
    vreme,
    rbr_dana,
    rbr_dogadjaja
)
AS
SELECT p1.ibk,
       p1.vreme,
       (COUNT(p2.ibk) - 1) / 3 AS rbr_dana,
       MOD(COUNT(p2.ibk) - 1, 3) AS rbr_dogadjaja
  FROM provlacenja AS p1
       INNER JOIN
       provlacenja AS p2
         ON p1.ibk = p2.ibk
        AND p1.vreme >= p2.vreme
 GROUP BY p1.ibk, p1.vreme;
NAPOMENA: Ovaj pogled koristi DIV i MOD funkcije, gde znak / oznacava DIV. Na ovo mozda treba obratiti paznju kada se resenje portuje na druge sisteme.

Ovaj pogled se zasniva na cinjenici da u svakom radnom danu postoji tacno 3 dogadjaja: dolazak, overa i odlazak. Pogled odradjuje sledece stvari:
- Prebrojava sve dogadjaje vezane za jednu karticu (COUNT uz standardno INNER JOIN >= povezivanje tabele same sa sobom),
- Pomocu DIV 3 odredjuje redni broj dana u kom se dogadjaj desio,
- Pomocu MOD 3 odredjuje redni broj dogadjaja unutar pojedinacnog dana.

Upit koji daje resenje poziva gornji pogled:
Code:

SELECT ibk,
       rbr_dana,
       MAX(CASE WHEN rbr_dogadjaja = 0
                THEN vreme
                ELSE NULL
           END) AS dolazak,
       MAX(CASE WHEN rbr_dogadjaja = 1
                THEN vreme
                ELSE NULL
           END) AS provera,
       MAX(CASE WHEN rbr_dogadjaja = 2
                THEN vreme
                ELSE NULL
           END) AS odlazak
  FROM razvrstavanja_provlacenja_3
 GROUP BY ibk, rbr_dana
 ORDER BY ibk, rbr_dana

Upit radi sledece stvari:
- razvrstava dogadjaje u tri kolone u zavisnosti od rednog broja dogadjaja unutar dana (CASE i NULL)
- uklanja nepotrebne NULL-ove da bi vremena isplivala na pocetak (MAX)
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

brzak

Član broj: 66407
Poruke: 126



+5 Profil

icon Re: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla07.06.2013. u 08:42 - pre 131 meseci
Slucajno naleteh na temu, pa mozda nekom pomogne. Resenje je za PostgreSQL a mislim da ce raditi i na Oracle.

Bez overe:

select ibk,dolazak,odlazak from
(
select ibk,vreme as dolazak
,nth_value(vreme, 2) over (PARTITION by ibk order by vreme range between current row and unbounded following) as odlazak
,row_number() over (PARTITION by ibk order by vreme) rbr
from provlacenja
) pu
where rbr % 2 = 1

Sa overom:

select ibk,dolazak,overa,odlazak from
(
select ibk,vreme as dolazak
,nth_value(vreme, 2) over (PARTITION by ibk order by vreme range between current row and unbounded following) as overa
,nth_value(vreme, 3) over (PARTITION by ibk order by vreme range between current row and unbounded following) as odlazak
,row_number() over (PARTITION by ibk order by vreme) rbr
from provlacenja
) pu
where rbr % 3 = 1

[Ovu poruku je menjao brzak dana 07.06.2013. u 09:59 GMT+1]
 
Odgovor na temu

[es] :: Baze podataka :: [SQL mozgalice] Mozgalica broj 7 - dolazak i odlazak s posla

[ Pregleda: 5411 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.