Сначала попробуйте сами: на собеседовании подсказки не будет.
Три шага, каждый в своём CTE. Сначала убираем шум: сессии короче 5 секунд, сравнивая session_end - session_start с интервалом. Затем первая сессия дня: row_number() по пользователю и календарному дню с сортировкой по времени, оставляем rn = 1.
Для флага нужна первая сессия именно предыдущего календарного дня, а не предыдущей строки. Поэтому через lag берём и устройство, и дату прошлой строки, и проверяем prev_d = d - 1: если пользователь пропустил день, флаг не ставится, даже если устройства сменились.
WITH clean AS (SELECT * FROM user_sessions WHERE session_end - session_start >= interval '5 seconds'), firsts AS (SELECT user_id, session_start, device_type, session_start::date AS d, row_number() OVER (PARTITION BY user_id, session_start::date ORDER BY session_start) AS rn FROM clean), daily AS (SELECT user_id, session_start, device_type, d, lag(device_type) OVER (PARTITION BY user_id ORDER BY d) AS prev_device, lag(d) OVER (PARTITION BY user_id ORDER BY d) AS prev_d FROM firsts WHERE rn = 1) SELECT user_id, session_start, device_type, (device_type = 'mobile' AND prev_device = 'desktop' AND prev_d = d - 1) AS device_switch FROM daily