hql利用累积和数据处理一例

需求信息:
3、关卡数据
3.1、关卡数据统计:数据组得到具体的活动Id,查询 vchushou数据库 jellyfish_playground_open , 线上数据库 jellyfish_playground ,表:event_game_stage_level, 记录数为关卡数
3.2、关卡明细信息表 event_game_stage_user_detail, 指定的活动Id - stage_id,   关卡数 - level.  结果 - result [0 - 失败, 1闯关, 2复活]
1、正式场人数: 当前关卡之前的所有关卡,闯关全部都是非失败 result > 0
2、模拟场人数:当前关卡之前的所有关卡,出现过失败。或者没有关卡明细数据
3、晋级人数:正式场人数,并且当前结果是非失败
4、复活人数:正式场人数,并且当前结果是复活
疑难问题:
正式场人数:当前关卡之前的所有关卡,闯关全部都是非失败 result > 0
模拟场人数:当前关卡之前的所有关卡,出现过失败。或者没有关卡明细数据

问题解析:

关卡是1\2\3\4这种方式,全部非失败则判断各个关卡的结果都大于0(result > 0);有些复杂和麻烦。
临时想到, 将通关的那个结果置为1,否则置为0;然后取其累积和,若与关卡编号相同,则表明之前全部通关;反之之前有未通关的关卡。
前台程序的设定,未通关也可进入下一场,设为模拟场;也可以前关都未做,而中间开始一场,也是为模拟场。
程序处理代码:
with tab_stage_level_basic as(
select a1.stage_id,a1.`level` stage_level,a1.start_time,a1.playtime,a2.uid,a2.result,
case when a2.result>0 then 1 else 0 end formal_type,
sum((case when a2.result>0 then 1 else 0 end))over(partition by a1.stage_id,a2.uid order by a1.`level` asc) accumulate_result
from xxxxx_event_game_stage_level a1
left join xxxxx_event_game_stage_user_detail a2 on a1.stage_id=a2.stage_id and a1.`level`=a2.`level`
order by a1.stage_id,a2.uid,stage_level)
select a1.stage_level,a2.stage_level_uid_cnt formal_stage_level_uid_cnt,a3.stage_level_uid_cnt simulation_stage_level_uid_cnt,a2.stage_level_promotion_uid_cnt,a2.stage_level_resurrection_uid_cnt,a4.record_report_uid_cnt,a4.gamein_uid_cnt
from (select a1.stage_level
from tab_stage_level_basic a1
group by a1.stage_level) a1
left join (select a1.stage_level,count(distinct a1.uid) stage_level_uid_cnt,count(distinct case when a1.result>0 then a1.uid else null end) stage_level_promotion_uid_cnt,count(distinct case when a1.result=2 then a1.uid else null end) stage_level_resurrection_uid_cnt
from tab_stage_level_basic a1
where a1.stage_level=a1.accumulate_result
group by a1.stage_level) a2 on a1.stage_level=a2.stage_level
left join (select a1.stage_level,count(distinct a1.uid) stage_level_uid_cnt
from tab_stage_level_basic a1
where a1.stage_level<>a1.accumulate_result
group by a1.stage_level) a3 on a1.stage_level=a3.stage_level
left join (select a1.stage_level,count(distinct case when a1.result<>-1 then a1.uid else null end) record_report_uid_cnt,count(distinct a1.uid) gamein_uid_cnt
from tab_stage_level_basic a1
group by a1.stage_level) a4 on a1.stage_level=a4.stage_level
;
关键核心处理:
select a1.stage_id,a1.`level` stage_level,a1.start_time,a1.playtime,a2.uid,a2.result,
case when a2.result>0 then 1 else 0 end formal_type,
sum((case when a2.result>0 then 1 else 0 end))over(partition by a1.stage_id,a2.uid order by a1.`level` asc) accumulate_result
from xxxxx_event_game_stage_level a1
left join xxxxx_event_game_stage_user_detail a2 on a1.stage_id=a2.stage_id and a1.`level`=a2.`level`
order by a1.stage_id,a2.uid,stage_level

猜你喜欢

转载自blog.csdn.net/BabyFish13/article/details/81005694
今日推荐