SQL LAG

Read a previous ordered row without a self join.

What & Why

LAG reads a value from a prior row according to the window's partition and order. It makes backward-looking period comparisons, transitions, and elapsed gaps concise while preserving the original row grain.

See How It Works

BUSINESS QUESTION

Compare each daily active-user value with the previous day.

date_daydaunew_usersreturning_users
2024-04-0112401801060
2024-04-0213152051110
2024-04-0312881641124
2024-04-0413922211171
Watch LAG read the previous DAU rowStep 1 of 4
LAG(dau) OVER (ORDER BY date_day)
date_daydauprevious_dauchange_from_previous
2024-04-011240NULLNULL
2024-04-0213151240+75
2024-04-0312881315-27
2024-04-0413921288+104

The first date has no previous row.

EXAMPLE QUERY
SELECT
  date_day,
  dau,
  LAG(dau) OVER (ORDER BY date_day) AS previous_dau,
  dau - LAG(dau) OVER (ORDER BY date_day) AS change_from_previous
FROM growth.daily_active_users
ORDER BY date_day;

This lesson's practice is part of Pro.

Advanced business practice

Sign up free to try it on a real business scenario