CREATE TABLE IF NOT EXISTS analytics_content_sessions ( content_session_hash TEXT PRIMARY KEY, day DATE NOT NULL, visitor_hash TEXT NOT NULL, session_hash TEXT NOT NULL, path TEXT NOT NULL, post_id UUID REFERENCES posts(id) ON DELETE SET NULL, page_id UUID REFERENCES pages(id) ON DELETE SET NULL, source_group TEXT NOT NULL DEFAULT '', source_name TEXT NOT NULL DEFAULT '', device_type TEXT NOT NULL DEFAULT '', os_name TEXT NOT NULL DEFAULT '', keyword TEXT NOT NULL DEFAULT '', view_recorded BOOLEAN NOT NULL DEFAULT false, first_seen_at TIMESTAMPTZ NOT NULL DEFAULT now(), last_seen_at TIMESTAMPTZ NOT NULL DEFAULT now(), duration_seconds INTEGER NOT NULL DEFAULT 0, max_scroll_ratio REAL NOT NULL DEFAULT 0, engaged_recorded BOOLEAN NOT NULL DEFAULT false, scroll_25_recorded BOOLEAN NOT NULL DEFAULT false, scroll_50_recorded BOOLEAN NOT NULL DEFAULT false, scroll_75_recorded BOOLEAN NOT NULL DEFAULT false, scroll_100_recorded BOOLEAN NOT NULL DEFAULT false, read_recorded BOOLEAN NOT NULL DEFAULT false, read_at TIMESTAMPTZ ); CREATE INDEX IF NOT EXISTS analytics_content_sessions_day_idx ON analytics_content_sessions (day DESC); CREATE INDEX IF NOT EXISTS analytics_content_sessions_session_idx ON analytics_content_sessions (session_hash); CREATE INDEX IF NOT EXISTS analytics_content_sessions_post_idx ON analytics_content_sessions (post_id, day DESC) WHERE post_id IS NOT NULL; CREATE INDEX IF NOT EXISTS analytics_content_sessions_page_idx ON analytics_content_sessions (page_id, day DESC) WHERE page_id IS NOT NULL; ALTER TABLE analytics_active_sessions ADD COLUMN IF NOT EXISTS content_session_hash TEXT NOT NULL DEFAULT '';