题目链接:点击打开链接
题目大意:略。
解题思路:
- 解决方案(1):先用 WITH AS 语句算出经过排序后以及打一个每组第一次登录的标记(mark);然后下面的查询不用过多解释了吧(分子不需要 DISTINCT 因为可以保证每组只有一个)
- 解决方案(2):略,太好理解了
AC 代码
--解决方案(1) WITHt1AS( WITHt2AS(SELECT*FROMActivityORDERBYplayer_id, event_date) SELECT*, IF(<>player_id, 1, 0) mark, :=player_idFROMt2, (SELECT :=-1) init) SELECTROUND((SELECTCOUNT(tt2.player_id) FROMt1tt1, t1tt2WHEREtt1.player_id=tt2.player_idANDDATEDIFF(tt1.event_date, tt2.event_date) =1ANDtt2.mark=1) /(SELECTCOUNT(DISTINCTplayer_id) FROMActivity), 2) ASfraction--解决方案(2) SELECTROUND(avg(a.event_dateISNOTNULL), 2) fractionFROM (SELECTplayer_id, min(event_date) ASloginFROMactivityGROUPBYplayer_id) pLEFTJOINactivityaONp.player_id=a.player_idANDdatediff(a.event_date, p.login) =1