Change-log tables hold every version of a row and you almost always want the current one. Getting this wrong gives you a random version rather than the newest, and it looks fine until someone checks.
Write latest_per_user(df).
df has columns user_id, updated_at (date strings) and plan. There may be several rows per user. Return one row per user: the one with the latest updated_at.
You have read the opening. The rest is free with a Bezen account, and no card is needed.
Behind the sign-in