1) You can get the previous record with something like:
prev = QueryLast("mytable where date < " $ Display(currrent_date) $ " sort date")
Note: "previous" only makes sense when you specify a sort, otherwise Suneido doesn't guarantee any particular order.
If you wanted to get multiple previous records you could use the same query and read Prev multiple times.
2) I would leave it as a calculated column unless speed becomes a problem.
3) see (1)
4) if the data is small enough (e.g. less than 10,000 records) then it may be easier to read the data into memory and work with it there. Then you do not need to do queries to get previous records.