I’m working with a database that contains daily sales information of different products and stores.
x
StoreSku Date UnitsSale
A-2134 20/04/2019 2
A-2135 20/04/2019 1
A-2134 19/04/2019 5
A-2134 18/04/2019 3
A-2135 19/04/2019 6
i want to add a column with one day ago unit sales information
StoreSku Date UnitsSale OneDaySales
A-2134 20/04/2019 2 5
A-2135 20/04/2019 1 6
A-2134 19/04/2019 5 3
A-2134 18/04/2019 3 NULL
A-2135 19/04/2019 6 NULL
i’ve got to be honest, i don’t know if sql is able to achieve this. If not, could you please recommend a way? considering there are over thousands of records.
Advertisement
Answer
You are probably looking for lag()
:
select t.*,
lag(UnitsSale) over (partition by StoreSku order by Date) as prev_unitsSale
from t;
Alternatively, you can use a left join
with date arithmetic. That varies by database, but the standard would be:
select t.*, tprev.UnitsSale as prev_unitssale
from t left join
t tprev
on tprev.StoreSku = t.StoreSku and
tprev.Date = t.date - interval '1 day';
These are not exactly equivalent. The first will get the previous day in the data. The second will get the previous day — with NULL
for the day after missing days.