Använd generate_series() :
select gs.i, t.*
from t cross join lateral
generate_series(start_i, end_i, 1) gs(i);
Strängt taget, den lateral behövs inte. Men det förklarar vad som händer. Jag bör också notera att du också kan göra:
select generate_series(start_i, end_i) as i, t.*
from t;
Men generate_series() påverkar antalet rader i frågan. Jag är obekväm med att ha sådana effekter i SELECT klausul.