勘違い

PARTITION BY は、行を集約せずに、グループ内の順位や累計を取るためのもの。集約じゃない。GROUP BY とは別物。

救われた瞬間

SELECT id, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM events;

これで、ユーザーごとに最新N件、が一発で取れる。