» »

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):

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL-DML pomoč

Oddelek: Programiranje
51002 (825) JackCola
»

Baza & c#

Oddelek: Programiranje
214172 (3230) xardas
»

[Oracle] Osnovno povpraševanje problem

Oddelek: Programiranje
151924 (1565) zdravc
»

[Visual C#] TableAdapter

Oddelek: Programiranje
61146 (1022) detroit
»

SQL problem

Oddelek: Programiranje
111353 (1200) JanezH

Več podobnih tem