Assuming SQL Server 2005 or later, you can use ROW_NUMBER()
and a common table expression to arrange the table appropriately:
;With OrderedRows as (
select PK, Pv, Cash,
ROW_NUMBER() OVER (ORDER BY PK) as rn --Is this correct?
from MyTable
)
select or1.PK,or1.Pv,or1.Cash,COALESCE(or2.Cash,0)
from
OrderedRows or1
left join
OrderedRows or2
or1.rn = or2.rn + 2
In the above, I've assumed PK
defines the order in which rows should be considered, such that "two rows earlier" from your question even makes sense.
In general, Cursors should be viewed as a tool of last resort. You should always try, first, to formulate your query be talking about what the entire result set should look like - not how you (if you had to) would work it out, row by row.