Join a table to itself, each row needs to join to the ordered last record
You can use LEAD() function to get the next value:

Quoted from docs:


  Accesses data from a subsequent row in the same result set without the use of a self-join starting with SQL Server 2012 (11.x). LEAD provides access to a row at a given physical offset that follows the current row. Use this analytic function in a SELECT statement to compare values in the current row with values in a following row.


SELECT
  UID,
  historyFor,
  DateUpdated,
  [Table],
  [Column],
  oldValue,
  LEAD(oldValue) OVER (PARTITION BY [Table], [Column]
                       ORDER BY DateUpdated) nextValue
FROM
  t;




UID | historyFor | DateUpdated         | Table  | Column    | oldValue | nextValue
--: | :--------- | :------------------ | :----- | :-------- | :------- | :--------
  1 | uid=123    | 01/01/2019 00:00:00 | Person | firstname | Joe      | Bill     
  2 | uid=123    | 01/02/2019 00:00:00 | Person | firstname | Bill     | Elliot   
  3 | uid=123    | 01/03/2019 00:00:00 | Person | firstname | Elliot   | null     



db&lt;>fiddle here