점진적 과부하가 제대로 일어나는지. 플래토 3주 이상이면 deload 신호.
Push / Pull / Legs / Core 비중. 한쪽 치우치면 밸런스 경고.
WITH me AS (SELECT auth.uid() AS uid), last90 AS ( SELECT s.* FROM workout_sessions s, me WHERE s.user_id = me.uid AND s.started_at >= now() - interval '90 days' ) SELECT (SELECT count(*) FROM last90) AS sessions_90d, (SELECT sum(total_volume_load_kg) FROM last90) AS volume_kg_90d, (SELECT max(e1rm_kg) FROM exercise_sets_with_pr WHERE user_id = (SELECT uid FROM me) AND exercise_id = 'benchPress' AND session_started_at >= now() - interval '90 days') AS bench_e1rm, (SELECT max(e1rm_kg) FROM exercise_sets_with_pr WHERE user_id = (SELECT uid FROM me) AND exercise_id = 'squat' AND session_started_at >= now() - interval '90 days') AS squat_e1rm;
SELECT date_trunc('day', session_started_at)::date AS day, count(*) AS sets, bool_or(is_weight_pr OR is_e1rm_pr) AS has_pr FROM exercise_sets_with_pr WHERE user_id = auth.uid() AND session_started_at >= now() - interval '90 days' AND warmup_detected = false GROUP BY day ORDER BY day;
SELECT session_id, started_at, duration_min, session_rpe, mood, total_volume_load_kg, body_part_group, exercise_id, exercise_name_ko, working_sets, warmup_set_count, has_pr FROM session_exercise_summary WHERE user_id = auth.uid() ORDER BY started_at DESC, entry_order LIMIT 50; -- client groups by session_id, shows top 10 sessions
SELECT session_started_at, weight_kg, rep_count, rpe, e1rm_kg, is_weight_pr, is_e1rm_pr FROM exercise_sets_with_pr WHERE user_id = auth.uid() AND exercise_id = 'benchPress' -- or 'squat' / 'deadlift' / 'militaryPress' AND warmup_detected = false AND session_started_at >= now() - interval '90 days' ORDER BY session_started_at, set_index;
SELECT em.body_part_group, -- push / pull / legs / core count(es.id) AS sets FROM exercise_sets_with_pr es JOIN exercise_metadata em USING (exercise_id) WHERE es.user_id = auth.uid() AND es.session_started_at >= now() - interval '7 days' AND es.warmup_detected = false GROUP BY em.body_part_group;
SELECT date_trunc('week', session_started_at)::date AS week, sum(volume_load_kg) AS volume_kg, count(*) AS sets FROM exercise_sets_with_pr WHERE user_id = auth.uid() AND session_started_at >= now() - interval '90 days' AND warmup_detected = false GROUP BY week ORDER BY week;
SELECT em.name_ko, em.body_part_group, count(DISTINCT session_id) AS sessions, count(*) AS working_sets, max(e1rm_kg) AS best_e1rm FROM exercise_sets_with_pr es JOIN exercise_metadata em USING (exercise_id) WHERE es.user_id = auth.uid() AND es.warmup_detected = false AND es.session_started_at >= now() - interval '90 days' GROUP BY em.name_ko, em.body_part_group ORDER BY working_sets DESC LIMIT 10;