Window functions liczą wartości na “oknie” wierszy, ale zachowują każdy wiersz w wyniku (w przeciwieństwie do GROUP BY, które grupuje wiersze w jeden). Są świetne do rankingów, sum narastających i “top N per grupa”.
SELECT user_id,
created_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM logins;