WITH ### 每个月用户的 monthly_practices_u AS( SELECT device_id,DATE_format(event_date,'%Y-%m') ym,COUNT(question_id) m_user_cnt FROM question_practice_detail GROUP BY DATE_format(event_date,'%Y-%m'),device_id ), ### 每个月总的 monthly_practices AS( SELECT DATE_format(event_date,'%Y-%m') ym,COUNT(question_id) m_cnt FROM question_practice_detail GROUP BY DATE_format(event_date,'%Y-%m') ), ### 每个月用户累计的 monthly_practices_u_sum AS( SELECT device_id,ym,SUM(m_user_cnt) OVER(partition by device_id order by ym) sum_cnt FROM monthly_practices_u ), ### 每个月全局累计的 monthly_practices_sum AS( SELECT ym,SUM(m_cnt) OVER(order by ym) total_cnt FROM monthly_practices ), ### 每三个月平均的 3month_practices_avg AS( SELECT device_id, ym, ROUND(AVG(m_user_cnt) OVER(partition by device_id order by ym ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),2) avg3_cnt FROM monthly_practices_u ) SELECT t1.device_id,t1.ym,t1.sum_cnt,t3.avg3_cnt,t2.total_cnt FROM monthly_practices_u_sum t1 INNER JOIN monthly_practices_sum t2 ON t1.ym= t2.ym INNER JOIN 3month_practices_avg t3 ON t1.device_id = t3.device_id AND t1.ym = t3.ym ORDER BY t1.device_id,t1.ym