Jeśli silnik wspiera funkcje analityczne, to może. LAG/LEAD?
select
czynnosc,
lead(data_godzina) over (partition by pracownik order by data_godzina) koniecCzynnosci
data_godzina pocztekCzynnosci
from tabelka;
LEAD zwraca wartość atrybutu z "następnego wiersza" w result secie (bądź jakieś podgrupie rekordów: partition by pracownik -> podgrupa czynnosci pracownika, order by - uporzadkowana po data_godina)
Zauważ, że lead() może zwrócić NULL w przypadku braku ostatniego rekordu (czynnoość nie zakończyłą się), więc trzeba to sobie obsłużyć jakoś, np. casem, podzapytaniem czy jakoś inaczej.
Poniżej wersja, której nie testowałem, ale ma teoretyczny potencjał :P
select
czynnosc,
coalesce( to_char(lead(data_godzina) over (partition by pracownik order by data_godzina) - data_godzina), 'CZYNNOSC NIE ZAKONCZYLA SIE') czas_trwania
from tabelka;