Forum » Pomoč in nasveti » Mala pomoč z sql stavkom
Mala pomoč z sql stavkom
ajsin1 ::
Živjo, nekaj bi rad zoptimiziral, pa mi ne gre, ker nimam ravno kaj dosti izkušenj z sqlom. Imam sqlite3 bazo, notri dve tabele (podatki in vsebina so čisto izmišljeni, ampak princip je isti)
Recimo da imam tabelo "ljudje", ki vsebuje:
-emšo (id)
-ime
-priimek
-itd. itd.
In tabelo "meritve", ki vsebuje podatke o ljudeh:
-emšo (id)
-višina
-teža
-čas meritve
-itd. itd.
Tabela ljudje je vedno OK in veljavna, problem imam s tabelo z meritvami, kjer so določeni podatki (višina, teža, čas meritve) "napačni" - naprimer "-Inf", ali "ERROR" ali "NaN", ipd. Torej nekaj, kar se da sfiltrirat (če je sama teža 50kg namesto 70kg, ni moj problem, motijo me samo neveljavni podatki).
Kar bi pa rad pa je, da za vsakega človeka dobim najnovejšo veljavno višino in težo (oboje iz iste vrstice) (če obstaja - če ne, niti ne pokaži tega človeka)
Trenutna koda, ki je bila napisana nevemkdaj (nisem jaz pisal, samo tweakal po potrebi) naredi nekaj takega (zelo poenostavljena psevdokoda):
Koda dela super (kar se tiče funkcionalnosti), ampak zaradi ogromnega števila querjev traja dolgo (minute+). Mislim (nisem 100%), da bi se dalo to delo offloadat na bazo v en query z joinom, samo ga ne znam napisat. Torej bi rad iz tabele meritve za vsak emšo dobil najnovejšo meritev, kjer so vsi podatki v celicah veljavni in zraven nalepil ime in priimek iz tabele ljudje. Za vsak emšo v "meritve" ziher obstaja emšo+podatki v tabeli ljudje (ni pa nujno obratno)
Recimo da imam tabelo "ljudje", ki vsebuje:
-emšo (id)
-ime
-priimek
-itd. itd.
In tabelo "meritve", ki vsebuje podatke o ljudeh:
-emšo (id)
-višina
-teža
-čas meritve
-itd. itd.
Tabela ljudje je vedno OK in veljavna, problem imam s tabelo z meritvami, kjer so določeni podatki (višina, teža, čas meritve) "napačni" - naprimer "-Inf", ali "ERROR" ali "NaN", ipd. Torej nekaj, kar se da sfiltrirat (če je sama teža 50kg namesto 70kg, ni moj problem, motijo me samo neveljavni podatki).
Kar bi pa rad pa je, da za vsakega človeka dobim najnovejšo veljavno višino in težo (oboje iz iste vrstice) (če obstaja - če ne, niti ne pokaži tega človeka)
Trenutna koda, ki je bila napisana nevemkdaj (nisem jaz pisal, samo tweakal po potrebi) naredi nekaj takega (zelo poenostavljena psevdokoda):
select * from ljudje #pridobim ime + emšo od vseh for each emšo { select * from meritve where emšo="$emšo" and where višina > 20 and where višina < 250 and where teža > 0 and where teža < 250 ...itd.itd..... order by čas_meritve #s tem dobim zadnjo meritev kjer so vsi podatki veljavni if(obstaja taka vrstica z temi podatki) { izpiši podatek v nekem formatu nekam npr: print "ime teža višina" } else { ne izpiši nič, pojdi dalje na naslednjega človeka } }
Koda dela super (kar se tiče funkcionalnosti), ampak zaradi ogromnega števila querjev traja dolgo (minute+). Mislim (nisem 100%), da bi se dalo to delo offloadat na bazo v en query z joinom, samo ga ne znam napisat. Torej bi rad iz tabele meritve za vsak emšo dobil najnovejšo meritev, kjer so vsi podatki v celicah veljavni in zraven nalepil ime in priimek iz tabele ljudje. Za vsak emšo v "meritve" ziher obstaja emšo+podatki v tabeli ljudje (ni pa nujno obratno)
Fuks ::
Verjetno se da tudi bolj preprosto. Tukaj je ena varianta: izbereš vse iz prve in druge tabele, ter ju povežeš z eno tabelo, kjer izbereš vsak emšo le po enkrat in ob njem zadnji datum meritve (ter narediš filtracijo odvečnih).
SELECT L.*, M.* FROM Ljudje L JOIN (SELECT emšo, MAX(Datum) as MaxDatum FROM Meritve WHERE višina > 20 ... in ostali pogoji GROUP BY emšo ) as LM ON (L.emšo = LM.emšo) JOIN Meritve M ON (LM.emšo = M.emšo AND LM.MaxDatum = M.Datum)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | SQL-DML pomočOddelek: Programiranje | 1002 (825) | JackCola |
» | Baza & c#Oddelek: Programiranje | 4172 (3230) | xardas |
» | [Oracle] Osnovno povpraševanje problemOddelek: Programiranje | 1923 (1564) | zdravc |
» | [Visual C#] TableAdapterOddelek: Programiranje | 1146 (1022) | detroit |
» | SQL problemOddelek: Programiranje | 1352 (1199) | JanezH |