jest tabela o 3 polach umowa_id, kwota, czas_id
zadne z pol nie jest unikalne. Dla jednej umowy moze wystepowac wiele kwot w roznym czasie. potrzebuje dla wszystkich umow tylko te rekordy, ktore sa pozniejsze (czas_id) niz ostatni rekord dla danej umowy w ktorym kwota jest 0. Ponizej przyklad: dane: 1,2,-01-01 1,0,-01-02 1,2,-01-03 2,2,-01-04 1,0,-01-05 3,1,-01-06 1,3,-01-07 1,15,-01-08
w rezultacie powinienem uzyskac dane 2,2,-01-04 3,1,-01-06 1,3,-01-07 1,15,-01-08
Jesli ktos ma pomysl (np. jakis zagniezdzony sql) to bylbym wdzieczny.
Pozdrawiam
Marcin Wojtowski
czy da sie takie zapytanie zrobic w czystym sql?
jest tabela o 3 polach umowa_id, kwota, czas_id
zadne z pol nie jest unikalne. Dla jednej umowy moze wystepowac wiele kwot w roznym czasie. potrzebuje dla wszystkich umow tylko te rekordy, ktore sa pozniejsze (czas_id) niz ostatni rekord dla danej umowy w ktorym kwota jest 0. Ponizej przyklad: dane: 1,2,-01-01 1,0,-01-02 1,2,-01-03 2,2,-01-04 1,0,-01-05 3,1,-01-06 1,3,-01-07 1,15,-01-08
w rezultacie powinienem uzyskac dane 2,2,-01-04 3,1,-01-06 1,3,-01-07 1,15,-01-08
Jesli ktos ma pomysl (np. jakis zagniezdzony sql) to bylbym wdzieczny.
Pozdrawiam
Marcin Wojtowski
select * from tabelka t1 where exists( select * from tabelka where t1.czas_id>(select MAX(czas_id) from tabelka where kwota=0 and umowa_id=t1.umowa_id) ) union select * from tabelka where umowa_id not in (select umowa_id from tabelka where kwota=0)
Nie wiem czy optymalne czy nie, ale dziala ;) - tzw. (pod)zapytania skorelowane Dla MS SQL byc moze trzeba dodac slówko as pomiedzy tabelka i t1, ale nie jestem pewny. W MS SQL dziala bez problemu.
jest tabela o 3 polach umowa_id, kwota, czas_id
zadne z pol nie jest unikalne. Dla jednej umowy moze wystepowac wiele kwot w roznym czasie. potrzebuje dla wszystkich umow tylko te rekordy, ktore sa pozniejsze (czas_id) niz ostatni rekord dla danej umowy w ktorym kwota jest 0. Ponizej przyklad: dane: 1,2,-01-01 1,0,-01-02 1,2,-01-03 2,2,-01-04 1,0,-01-05 3,1,-01-06 1,3,-01-07 1,15,-01-08
w rezultacie powinienem uzyskac dane 2,2,-01-04 3,1,-01-06 1,3,-01-07 1,15,-01-08
Uzytkownik napisal w wiadomosci
Hmm, czy chodzi Ci o cos takiego?
Select * From Tabelka As T Where T.czas_Id > IsNull((Select Max(czas_Id) From Tabelka As M Where M.umowa_id = T.umowa_id And kwota = 0), 0)
Albo tez Left Join zamiast podzapytania: Select * From Tabelka As T Left Join (Select umowa_id, Max(czas_Id) As MaxCzas From Tabelka Where kwota = 0 Group By umowa_id) As M On T.czas_id > M.MaxCzas Or M.umowa_id Is Null
Niektóre bazy powinny lepiej optymalizowac drugie zapytanie.
Pozdrawiam Grzegorz