WITH t_union as( SELECT DISTINCT uid, DATE_FORMAT(in_time,'%Y-%m-%d') AS dt FROM tb_user_log UNION SELECT DISTINCT uid, DATE_FORMAT(out_time,'%Y-%m-%d') AS dt FROM tb_user_log ), t as( SELECT uid,dt, MIN(dt)OVER(PARTITION BY uid) AS new_dt, LEAD(dt)OVER(PARTITION BY uid ORDER BY dt) AS next_dt FROM ...