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

Najbolje resenje za moj problem je?

[es] :: Access :: Najbolje resenje za moj problem je?

[ Pregleda: 2523 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vujkev
Beograd

Član broj: 8072
Poruke: 1347
*.telekom.yu



+104 Profil

icon Najbolje resenje za moj problem je?23.09.2004. u 08:24 - pre 237 meseci
Imam 2 tabele (Objekti i Dogadjaji) sa sledecom strukturom

OBJEKTI:
1. ID
2. Naziv
3. ......


DOGADJAJI:
1. ID
2. IdObjekta
3. TipDogadjaja
4. Datum
5. Vreme
6. ......

Potrebno mi je da iz tabele "Dogadjaji" za svaki objekat izvucem poslednji dogadjaj tipa "0" i maksimalno dva dogadjaja koja su upisana posle zadnjeg dogadjaja tipa "0". Naravno na taj rezultat treba da dodam podatke iz tabele Objekti tako da objekti.ID=Dogadjaji.IdObjekta.

Evo ga primer trazenog rezultata

Objekti.ID Objekti.naziv Dogadjaji.ID Dogadjaji.TipDogadjaja Dogadjaji.Datum
--------------------------------------------------------------------------------
1 Objekat1 45 0 23.09.2004
1 Objekat1 50 1 23.09.2004
1 Objekat1 87 8 23.09.2004
2 Objekat2 11 0 12.05.2004
2 Objekat2 154 5 20.09.2004
3 Objekat3 254 0 23.09.2004
5 Objekat5 55 0 12.03.2003
....

a sad objasnjenje:

Objekat1 je imao dogadjaj "0" dana 23.09.2004 i dogadjaje tipa 1 i 8 malo kasnije istog dana (to se vidi po vremenu i po ID-u dogadjaja)

Objekat2 je imao dogadjaj "0" dana 12.05.2004, i samo jedan dogadjaj nekog drugog tipa posle tog datuma

Objekat3 je imao dogadjaj "0" dana 23.09.2004 i nijedan drugi dogadjaj posle tog datuma

Objekat4 nije nikad imao dogadjaj tipa "0" tako da se ne pojavljuje u rezultatu

Objekat5 je imao dogadjaj........ itd. Nadam se da ste shvatili problem.

Trenutno ovaj problem resavam tako sto otvorim bazu Objekti i za svaki objekat pretrazujem bazu dogadjaji za tip "0". Ako nadjem tip "0" onda opet otvorim bazu dogadjaji i trazim sledeca 2 dogadjaja posle onog sa tipom "0".

Ovo sigurno moze da se resi dva query-a, ali me interesuje da li moze da se resi samo sa jednim query-em.


Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Najbolje resenje za moj problem je?23.09.2004. u 20:00 - pre 237 meseci
Ako je Access u pitanju, ovo bi trebalo da zavrsi posao:
Code:

(
SELECT IdObjekta, IdDogadjaja, TipDogadjaja, Datum,'NULA' AS Pomocnakolona
FROM Dogadjaji
WHERE (((TipDogadjaja)=0))
)

UNION

(
SELECT A.IdObjekta, A.IdDogadjaja, A.TipDogadjaja, A.Datum,'> NULA'  AS Pomocnakolona
FROM Dogadjaji AS A
WHERE (((A.IdDogadjaja) In (SELECT TOP 2 B.IdDogadjaja
FROM Dogadjaji AS B
WHERE B.IdObjekta=A.IdObjekta  AND B.TipDogadjaja>0
ORDER BY B.IdDogadjaja;)))
ORDER BY A.IdObjekta;
)



Ovo pod uslovom da ima samo jedan dogadjaj 0 po objektu. Ako moze da ima vise od jednog, stvari se dodatno komplikuju. I pretpostavio sam da IdDogadjaja raste, to jest dogadjaj 57 se desio pre dogadjaja 56 na primer.

Lep primer, nema sta. UNION pa jos subquery. Ako zakomplikujes uslove, trebace jos nekih kverija pre ova dva koji se unionizuju.

Usput, promenio sam naziv polja u tabeli Dogadjai. Umesto ID zove se IdDogadjaja, tako mi je bilo preglednije. Ostalo ostaje kako si naveo.

:-)
Prikačeni fajlovi
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
*.scnet.yu



+104 Profil

icon Re: Najbolje resenje za moj problem je?23.09.2004. u 23:27 - pre 237 meseci
na zalost tip dogadjaja "0" se ponavlja xyz puta, a meni treba samo zadnji
Kao dodatna prepreka meni treba samo tipdogadjaja "0" od pre dva dana, tj. da ne uzima u obzir podatke starije od 2 dana


Jooooj nikad necu uspeti, ali hvala u svakom slucaju. Ovu naredbu UNION prvi put u zivotu srecem, ali koliko vidim ovo je odlicna polazna tacka.

HVALA jos jednom
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Najbolje resenje za moj problem je?24.09.2004. u 13:32 - pre 237 meseci
OK sad znamo malo vise o uslovima.

jasno ti je da ovde u stvari radis sa dva kverija. UNION ih samo spoji, nalepi jedan an drugi, nesto ako Append Table. Uslov za to je da imaju isti broj kolona, sa istim tiopom podataka.

Prvi kveri ti vraca dogadja tipa nula. Ako hoces samo onaj u posladnaj dva dana, moras da prosiris WHERE. Imas dve opcije - da uzmes dogadja tipa nula gde je datum manji za dva od tekuceg, ili da ozmes poslednji dogadjaj tipa nula (onaj koji ima najveci IdDogadjaja).

Drugi kveri ti trenutno vraca dva doagadjaja koji nisu tipa nula, koji imaju najvece IdDogadjaja = poslednja dva ne-nula dogadjaja. Nigde se ne kaze da su oni nastupili posle tvog nula dogadjaja. To sam pretpostavio, da se nula dogadjaj desava pre ostalih, sto je verovatno pogresno. Ako pretpostavka nije tacna, onda mora da se promene uslovi i za drugi kveri.

I jedan i drugi kveri nisu trivijalni. Oba zahtevaju subkverije, drugi zavisi od prvog verovatno, i na kraju ih treba unionizovati (to je najlaksi deo). Posto su subkveriji u pitanju, ne mozes da korsitis Accessov query designer, moras da kucas SQL naredbe direktno. Pokusaj da sastavis svaki od njih nezavisno, pa ih na kraju unionizuj u jedan. Nije lako, ali sta se moze, ej?
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
*.telekom.yu



+104 Profil

icon Re: Najbolje resenje za moj problem je?24.09.2004. u 14:59 - pre 237 meseci
Za ogranicavanje na dva dana nije problem i sam sam to shvatio, ali imam problem sa ogranicavanjem druga dva dogadjaja. Kao sto si i predpostavio redosled kojim dogadjaji dolaze nije bitan tako da moze da se dogodi da dogadjaj tipa "6" dodje pre "0" ili bilo koja druga kombinacija.
Takodje problem je i to sto se u rezultatima pojavljuju i dogadjaji koji nisu tipa "0" cak iako ne postoji ni jedan dogadjaj tipa "0" za taj objekat, sto mi ne treba. To sto se dogadjaji javljaju pre i posle tipa "0" za sad nije problem jer sam dogadjaje sortirao po IdObjekta pa po IdDogadjaja i onda preoveravam da li je IdDogadjaja manji od onog gde je tip jednak "0".
Naravno bilo bi lepo da nista ne moram da radim tako da jos uvek trazim resenje na ovo
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

[es] :: Access :: Najbolje resenje za moj problem je?

[ Pregleda: 2523 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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