大概是这样做的? select event_id ,user_id ,to_date(times) as d ,session_id ,concat_ws(':',collect_list(lpad(cast(event_id as string),3,0)) over(partition by user_id,session_id order by times asc)) as path from( select event_id ,user_id ,times ,sum(session_flag) over (partition by user_id order by times) as session_id from ( select event_id ,user_id ,times ,case when lag(times) over (partition by user_id order by times) is null then 1 when (unix_timestamp(times) - unix_timestamp(lag(times) over (partition by user_id order by times))) > 600 then 1 else 0 end as session_flag from mock_data ) t1 ) t2