SQL (kako dobiti max datum)

Myx

Zelenc'
18. nov 2007
2
0
1
V Accessu imam tabelo, in sicer tečajnico. Notri so vsak dan zapiše za izbrane valute tečaj (se dopiše, tako da tabela raste). Težava je sedaj, kako naj izberem zadnji datum - v SQL-u bi rad spisal poizvedbo, ki bi mi prikazala tečaje za vse valute samo za zadnji datum. Vendar pa vedno ne vem, kateri je zadnji datum, tako da pogoj Where Datum=... ne deluje. Kako naj spišem poizvedbo... mogoče z uporabo Order by, vendar tudi tu ne vem, kako naprej.
 

doto

Fizikalc
25. jul 2007
3.175
0
36
SELECT TOP [st_valut] Tecaj, Valuta, ... ORDER BY Datum DESC

[st_valut] zamenjaš s številom valut v tečajnici.
 

Baksuz

Pripravnik
30. sep 2007
50
0
6
Kaj pa naslednja poizvedba?

SELECT TECAJI.VALUTA, TECAJI.TECAJ FROM TECAJI
WHERE TECAJI.DATUM = (SELECT MAX(TECAJI.DATUM) FROM TECAJI;)

Še za primer, če se vpisujejo samo spremembe (ne vse valute za vsak dan).

SELECT T1.VALUTA, T1.DATUM, T1.TECAJ
FROM TECAJI T1
WHERE T1.datum = (SELECT max(T2.DATUM) FROM TECAJI T2 where T1.valuta=T2.valuta);
 
Nazadnje urejeno:

tis

Fizikalc
25. jul 2007
5.423
0
36
Mikrohard in Baksuz sta podala pravo rešitev, ki deluje v primeru, ko se tečaj vsakokratno (za vsak datum) vpisuje v tabelo, ne glede na to ali se je valuta spremenila ali ne. V nasprotnem primeru (ko se tečaj vnaša le ob spremembah tečaja) pa je potrebno zadevo drugače rešiti. Recimo tako...

SELECT SIFVAL.VALUTA, (SELECT TECAJI.TECAJ
FROM TECAJI
WHERE TECAJI.VALUTA = SIFVAL.VALUTA
AND TECAJI.DATUM = (SELECT MAX(TECAJI.DATUM)
FROM TECAJI
WHERE TECAJI.VALUTA = SIFVAL.VALUTA)) TECAJ
FROM SIFVAL;

Ta rešitev seveda predvideva, da obstaja šifrant valut in unique indeks na polji VALUTA, DATUM na tabeli TECAJI.
Glede na to, da RDBMS-ja nimam poinstaliranega že ene pet let - kolikor časa se s tem ne ukvarjam več je tale rešitev le nakazana in lahko vsebuje kakšno napako... in nisem prepričan, da dela na access, saj sem jaz navajen na Oracle.

edit: alter je uničil podpisovanje...
 
Nazadnje urejeno:

Baksuz

Pripravnik
30. sep 2007
50
0
6
Še od mene za primer, ko sta posebej šifrant (VALUTE) in vrednosti (TECAJ):

SELECT VALUTE.ID_VAL, TECAJ.DATUM, TECAJ.VREDNOST FROM VALUTE
INNER JOIN TECAJ ON VALUTE.ID_VAL = TECAJ.ID_VAL
WHERE TECAJ.DATUM =
(SELECT MAX(TECAJ.DATUM) FROM TECAJ WHERE TECAJ.ID_VAL = VALUTE.ID_VAL);
 

KrNeki99

Fizikalc
3. sep 2007
888
25
28
Ljubljana
se moj prispevek (dela na SQL severju tko da bi znal tudi v Accessu)

ce so odlocis za katerokoli od teh opcij glej da imas primary key nastavljen id, date
drugace pa svetujem da vsakic ko vpises zapis v zgodovino tecajev, naredis update polij (menjalnitecaj,lastupdate) v sifrantu valut in ta podatek beres od tam

select TL.iID, TL.rRate, TL.dtDate
from TecajnaLista TL
inner join
( select iID, max(dtDate) as dt
from TecajnaLista
group by iID
) M on TL.iID=M.iID and TL.dtDate=M.dt

lp