sql ODPS常用例子

1.新手漏斗

SELECT 
        a.pt as 日期, 
        count(DISTINCT a.device_id) as 新增激活用户,
        round(sum(g1)/count(DISTINCT a.device_id), 3) as 成功进入游戏曝光,
        round(sum(if(game_level>=1, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第一关,
        round(sum(g2)/count(DISTINCT a.device_id), 3) as 1元弹框红包弹框曝光,
        round(sum(g3)/count(DISTINCT a.device_id), 3) as 游戏页一元红包点击,
        round(sum(g4)/count(DISTINCT a.device_id), 3) as 领取第一关奖励点击,
        round(sum(if(game_level>=2, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第二关,
        round(sum(if(game_level>=3, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第三关,
        round(sum(if(game_level>=4, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第四关,
        round(sum(if(game_level>=5, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第五关,
        round(sum(if(game_level>=6, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第六关,
        round(sum(if(game_level>=9, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第九关,
        round(sum(if(game_level>=10, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第10关,
        round(sum(if(game_level>=15, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第15关,
        round(sum(if(game_level>=20, 1, 0))/count(DISTINCT a.device_id), 3) as 通过第20关,
        round(sum(g5)/count(DISTINCT a.device_id), 3) as 第五关活动机会曝光,
        round(count(DISTINCT wx_open_id)/count(DISTINCT a.device_id), 3) as 微信登录,
        round(count(DISTINCT id_card)/count(DISTINCT a.device_id), 3) as 身份证绑定,
        round(sum(if(COALESCE(money, 0)>0, 1,0))/count(DISTINCT a.device_id), 3) as 提现成功

from (
        SELECT if(Sort_array(guide)[size(guide)-1]  >=1, 1, 0) as g1,   
        if(Sort_array(guide)[size(guide)-1]  >= 2, 1, 0) as g2,
        if(Sort_array(guide)[size(guide)-1]  >=3, 1, 0) as g3,
        if(Sort_array(guide)[size(guide)-1]  >=4, 1, 0) as g4,
        if(Sort_array(guide)[size(guide)-1] >= 5, 1, 0) as g5,
        device_id, wx_open_id, pt, id_card
        from   
    sync_mongo_box.extract_hztt_app_source__userinfo  
    WHERE   pt BETWEEN '${start}' and '${end}'
    AND SUBSTR(create_time,1,10) = pt
) as a 
LEFT JOIN 
(
    select device_id, tg_num as game_level, pt from sync_mongo_box.extract_hztt_app_source__userdaystat  
    WHERE   pt BETWEEN '${start}' and '${end}' and tg_num >= 1 
) as c 
on a.device_id = c.device_id and a.pt=c.pt
LEFT JOIN 
(
    SELECT sum(COALESCE(money, 0)) as money, device_id, pt 
        FROM sync_mongo_box.extract_hztt_app_source__extractcashrecord 
        WHERE pt BETWEEN '${start}' and '${end}'
        AND status = 3 GROUP by device_id, pt
) as b
on a.device_id = b.device_id and a.pt = b.pt
group by a.pt;

推人游戏启动漏斗

with a as(
    select device_id,pt from sync_mongo_box.extract_trmoney_app_source__userinfo
    WHERE   pt BETWEEN '${start}' and '${end}'
    AND SUBSTR(create_time,1,10) = '${end}' and create_time >="2020-02-26 19:00" GROUP by device_id,pt -- 新增表
),
b as(
    select device_id,ngx_date,act_page,event_name from liquid_log_project.log_trmoney_android 
    where ngx_date BETWEEN '${start}' and '${end}' and ngx_date_time >="2020-02-26 19:00"
)
SELECT  b.ngx_date,
        count( distinct if(event_name="b_entry_page" and act_page = "p_welcome", a.device_id, null)) 进入loading页的用户,
        count( distinct if(event_name="b_click_enter", device_id, null)) 同意隐私协议的用户,
        count( distinct if(event_name="b_game_plugin_install_already", device_id, null)) 插件安装成功的用户, 
        count( distinct if(event_name="b_entry_page" and act_page= "p_home_activity", device_id, null)) 成功进入app首页的用户,
        count( distinct if(event_name="b_click_game_start", device_id, null)) 点击开始游戏的用户,
        count( distinct if((event_name="b_entey_page" and act_page = "b_game_plugin_init") 
        or event_name = "b_game_plugin_init", device_id, null)) 开始启动插件的用户,
        count( distinct if(event_name="b_entry_page" and act_page="p_game_plugin", device_id, null)) 成功进入插件游戏的用户                         

from  a LEFT  join b  on a.device_id = b.device_id and a.pt = b.ngx_date
GROUP by b.ngx_date;

游戏加载时长是否成功进入app

--odps sql 
--********************************************************************--
--author:odps-game
--create time:2020-02-25 17:50:12
--********************************************************************--
--推人游戏加载时长&&是否成功进入app


with a as(
    select device_id,pt from sync_mongo_box.extract_trmoney_app_source__userinfo
    WHERE   pt BETWEEN '${start}' and '${end}'
    AND SUBSTR(create_time,1,10) = pt GROUP by device_id,pt -- 新增表
),
b as(
    -- p_welcome p_splash
    select * from (select duration,device_id,ngx_date 
    ,row_number()OVER(PARTITION by device_id,ngx_date order by ngx_date_time asc,duration DESC ) rn
    from liquid_log_project.log_trmoney_android 
    where ngx_date BETWEEN '${start}' and '${end}' and event_name ="b_leave_page" 
    and act_page = "p_welcome" ) a where rn=1-- 首次启动时长 duration  -- 一个人有多条只取时间最小的那一条         

), c as (
    select device_id,ngx_date from liquid_log_project.log_trmoney_android 
    where ngx_date BETWEEN '${start}' and '${end}' and event_name ="b_entry_page" 
    and act_page = "p_home_activity" GROUP by device_id,ngx_date -- 成功进入app
)
SELECT  a.pt,a.device_id,b.duration,if(c.device_id is not null ,1,0) isin  -- 日期、device_id、启动时长、是否进入app
from  a LEFT  join b  on a.device_id = b.device_id and a.pt = b.ngx_date 
        LEFT  join c  on a.device_id = c.device_id and a.pt = c.ngx_date; 

LTV 模版

--odps sql 
--********************************************************************--
--author:odps-game
--create time:2019-11-21 10:42:43
--********************************************************************--
with  new as ( --新增
SELECT  user_id
        ,pt
FROM    basic_data_center.odps_base_box_user_day_stat
WHERE   pt BETWEEN '${bdatestart}'
AND     '${bdateend}'
AND     day_age = 0
and     version_name='5.4.9.0'
)
,stat as (--活跃加三天
SELECT  user_id
        ,pt
        ,duration
FROM    basic_data_center.odps_base_box_user_day_stat
WHERE   pt BETWEEN '${bdatestart}'
AND     SUBSTR(DATEADD(TO_DATE('${bdateend}','yyyy-mm-dd'),3,'dd'),1,10)

)
SELECT  new.pt AS 日期
        ,CASE    WHEN basic_data_center.getbucketid(new.user_id,18) BETWEEN 0 AND 49 THEN 'A'
                 WHEN basic_data_center.getbucketid(new.user_id,18) BETWEEN 50 AND 99 THEN 'B' 
         END AS 策略
        ,sum(if(DATEDIFF(to_date(stat.pt,'yyyy-mm-dd'),to_date(new.pt,'yyyy-mm-dd'),'dd')=0,1,0 )) as 新增人数
        ,sum(if(DATEDIFF(to_date(stat.pt,'yyyy-mm-dd'),to_date(new.pt,'yyyy-mm-dd'),'dd')=0,duration,0 )) as 当天新增人数的总时长
        ,sum(if(DATEDIFF(to_date(stat.pt,'yyyy-mm-dd'),to_date(new.pt,'yyyy-mm-dd'),'dd')BETWEEN 0 and 1,duration,0 )) as `当天新增人数2日内时长(当天和第二天)`
        ,sum(if(DATEDIFF(to_date(stat.pt,'yyyy-mm-dd'),to_date(new.pt,'yyyy-mm-dd'),'dd')=2,duration,0 )) as `当天新增人数的+2天总时长`
        ,sum(if(DATEDIFF(to_date(stat.pt,'yyyy-mm-dd'),to_date(new.pt,'yyyy-mm-dd'),'dd')=3,duration,0 )) as `当天新增人数的+3天总时长`
FROM    new
        ,stat
WHERE   new.user_id = stat.user_id
GROUP BY new.pt
         ,CASE    WHEN basic_data_center.getbucketid(new.user_id,18) BETWEEN 0 AND 49 THEN 'A'
                  WHEN basic_data_center.getbucketid(new.user_id,18) BETWEEN 50 AND 99 THEN 'B' 
          END
;

宝箱新增LTV

    with
    data0 as(
        select pt,device_id
        FROM basic_data_center.extract_ttgame_extra_app_source__userdaystat
        WHERE pt between '${date_start}' AND '${date_end}' and day_age = 0       
        ), 
    data1 as(
        select pt,device_id , SUM(COALESCE(reward_coin, 0)) as total_reward,
         SUM(COALESCE(total_video_count, 0)) as video_count
        ,SUM(COALESCE(cg_game_time, 0)) as game_time   
        FROM basic_data_center.extract_ttgame_extra_app_source__userdaystat
        WHERE pt between '${date_start}' AND SUBSTR(DATEADD(TO_DATE('${date_end}','yyyy-mm-dd'),7,'dd'),1,10)
        GROUP BY pt,device_id
        ),
    data2 as (
        SELECT device_id,sum(COALESCE(money, 0)) as money, pt
        FROM basic_data_center.extract_ttgame_extra_app_source__extractcashrecord
        WHERE pt between '${date_start}' AND SUBSTR(DATEADD(TO_DATE('${date_end}','yyyy-mm-dd'),7,'dd'),1,10) AND status = 3 GROUP by pt,device_id
    ),all_data as (
            SELECT data1.pt, data1.device_id,total_reward,video_count
            ,game_time,money
            from data1 LEFT  join data2 on data1.device_id = data2.device_id  and data1.pt = data2.pt
               
                                                
    )
    SELECT 
    data0.pt
    ,sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 )) as 新增总人数

    ,round(
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,game_time,0 ))
        /
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
        /60
        ,3
    )as 新增人均时长

    ,round(
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,video_count,0 ))
        /
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
        ,3
    )as 新增人均视频数

    ,round(
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,total_reward,0 ))
        /
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
        ,3
    )as 新增人均名义补贴

    ,round(
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,money,0 ))
        /
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
        ,3
    )as 新增人均体现金额


    ,round(
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2 ,game_time,0 ))
        /
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
        /60
        ,3
    )as 3日人均时长

    ,round(
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2 ,video_count,0 ))
        /
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
        ,3
    )as 3日人均视频数

    ,round(
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2 ,total_reward,0 ))
        /
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
        ,3
    )as 3日人均名义补贴

    ,round(
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2 ,money,0 ))
        /
        sum(if(DATEDIFF(to_date(all_data.pt,'yyyy-mm-dd'),to_date(data0.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
        ,3
    )as 3日人均提现金额


    FROM data0
    ,all_data
    WHERE data0.device_id = all_data.device_id
    GROUP BY data0.pt;


    
    

页面渗透统计

--odps sql 
--********************************************************************--
--author:odps-game
--create time:2019-11-14 12:08:37
--********************************************************************--
with 
    a as (
        SELECT  user_id AS day_active_person ,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_index" GROUP BY  ngx_date,user_id
),sign_num as (
        SELECT  user_id AS sign_num_user_id,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_signIn" GROUP BY  ngx_date,user_id
)
,task_list as (
        SELECT  user_id AS task_user_id,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_taskList" GROUP BY  ngx_date,user_id
)
,activity_list as (
        SELECT  user_id AS activity_user_id,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_activityList" GROUP BY  ngx_date,user_id
)
,p_lottery as (
        SELECT  user_id AS p_lottery_user_id,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_lottery" GROUP BY  ngx_date,user_id
),p_carveup as (
        SELECT  user_id AS p_carveup_user_id,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_carveUp" GROUP BY  ngx_date,user_id
),mingame_chooseroom as (
        SELECT  user_id AS chooseroom_user_id,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_chooseRoom" GROUP BY  ngx_date,user_id
),mingame_matchgame as (
        SELECT  user_id AS p_matchgame_user_id,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_matchGame" GROUP BY  ngx_date,user_id
),mingame_p_game_list as (
        SELECT  user_id AS p_game_list_user_id,ngx_date AS pt
        FROM    liquid_log_project.log_box_android_master  
        WHERE   ngx_date = '${date}'
        AND     event_name = "h_enter_page" and act_page = "p_gameList" GROUP BY  ngx_date,user_id
)

select  a.pt as date,count(DISTINCT day_active_person) as all_person, --日活
count(DISTINCT sign_num_user_id) as sign_person_num, --打卡人数
count(DISTINCT task_user_id) as task_person_num,--任务赚币人数 
count(DISTINCT activity_user_id) as activity_person_num, --活动送币人数
count(DISTINCT p_lottery_user_id) as activity_person_jq_num, --活动送币奖券人数
count(DISTINCT p_carveup_user_id) as carveup_person_num, --瓜分百万人数
count(DISTINCT chooseroom_user_id) as mingame_chooseroom, --小游戏选择房间人数
count(DISTINCT p_matchgame_user_id) as mingame_matchgame, --小游戏匹配人数
count(DISTINCT p_game_list_user_id) as mingame__game_list --小游戏游戏列表人数
from  a LEFT  join sign_num  on a.day_active_person = sign_num.sign_num_user_id and a.pt= sign_num.pt
        LEFT  join task_list on a.day_active_person = task_list.task_user_id  and a.pt= task_list.pt 
        LEFT  join activity_list on a.day_active_person = activity_list.activity_user_id  and a.pt= activity_list.pt 
        LEFT  join p_lottery on a.day_active_person = p_lottery.p_lottery_user_id  and a.pt= p_lottery.pt 
        LEFT  join p_carveup on a.day_active_person = p_carveup.p_carveup_user_id  and a.pt= p_carveup.pt
        LEFT  join mingame_chooseroom on a.day_active_person = mingame_chooseroom.chooseroom_user_id  and a.pt= mingame_chooseroom.pt
        LEFT  join mingame_matchgame on a.day_active_person = mingame_matchgame.p_matchgame_user_id  and a.pt= mingame_matchgame.pt
        LEFT  join mingame_p_game_list on a.day_active_person = mingame_p_game_list.p_game_list_user_id  and a.pt= mingame_p_game_list.pt        
GROUP  by a.pt;

各项时长统计

--odps sql 
--********************************************************************--
--author:zhaoyingjie
--create time:2019-11-01 10:39:36
--********************************************************************--
with games as (  --人均时长
        select COUNT(a.user_id) AS new_add_nums,sum(game_times) as all_game_times, a.pt
        FROM (
                SELECT  pt,_id as user_id         
                from sync_mongo_box.extract_box_gamezone_source__userdetails 
                WHERE pt='${date}' and substr(create_time, 1, 10)='${date}'
                GROUP BY _id,pt
        ) as a 
        LEFT JOIN 
        (
            SELECT pt,user_id
                    ,SUM(
                        COALESCE(game_duration,0) --小游戏时长 
                        + COALESCE(huangdi_time,0) --皇帝时长  
                        + COALESCE(fishing_time,0) -- 捕鱼时长
                        + COALESCE(ddz_times,0)  --斗地主时长
                        + COALESCE(game_activity_cg_time,0) -- 闯关时长 
                        + COALESCE(majiang_times,0)  -- 麻将时长         
                    ) AS game_times
        
            FROM  sync_mongo_box.extract_box_gamezone_game_source__gamedaystat
            WHERE  pt = '${date}' GROUP BY pt,user_id
        )as b
        on a.user_id = b.user_id and a.pt = b.pt
        GROUP BY a.pt
)
,pingtai as (  --人均平台时长
        select COUNT(a.user_id) AS new_add_nums,sum(total_playtime) as all_pingtai_times, a.pt
        FROM (
                SELECT  pt,_id as user_id         
                from sync_mongo_box.extract_box_gamezone_source__userdetails 
                WHERE pt='${date}' and substr(create_time, 1, 10)='${date}'
                GROUP BY _id,pt
        ) as a 
        LEFT JOIN 
        (
            SELECT user_id,ngx_date,round((SUM(duration)/1000), 2) as total_playtime
            FROM liquid_log_project.log_box_android_master
            WHERE ngx_date = '${date}'
            AND event_name='b_leave_page'
            AND SUBSTR(target_url,1,56)  = 'https://saiyan_game_center.liquidnetwork.com/game_center' 
            AND duration < 3600000 and duration > 0
            and user_id in (
                SELECT user_id FROM sync_mongo_box.extract_box_gamezone_source__userdaystat 
                WHERE pt= '${date}'
            )GROUP by user_id,ngx_date
        )as b
        on a.user_id = b.user_id and a.pt = b.ngx_date
        GROUP BY a.pt
),
game_times as (
    select a.pt, 
        COUNT(if(ddz_times is null,null,a.user_id)) AS ddz_nums,--斗地主人数
        COUNT(if(majiang_times is null,null,a.user_id)) AS mj_nums, --麻将人数
        COUNT(if(game_duration ==0,null,a.user_id)) AS mingame_nums, --小游戏人数
        COUNT(if(huangdi_time is null,null,a.user_id)) AS huangdi_time_nums, --皇帝人数
        COUNT(if(fishing_time is null,null,a.user_id)) AS fishing_time_nums, --捕鱼人数
        COUNT(if(game_activity_cg_time is null,null,a.user_id)) AS game_activity_cg_nums, --闯关人数
        round(sum(if(ddz_times is null,0,ddz_times)) /COUNT(if(ddz_times is null,null,a.user_id))/ 60,2)  as avge_ddz_times, --斗地主人均时长  
        round(sum(if(majiang_times is null,0,majiang_times)) /COUNT(if(majiang_times is null,null,a.user_id))/ 60,2)  as avge_majiang_times, --麻将人均时长 
        round(sum(if(game_duration==0,0,game_duration)) /COUNT(if(game_duration==0,null,a.user_id))/ 60,2)  as avge_mingame_times, --小游戏人均时长 
        round(sum(if(huangdi_time is null,0,huangdi_time)) /COUNT(if(huangdi_time is null,null,a.user_id))/ 60,2)  as avge_huangdi_times, --皇帝人均时长
        round(sum(if(fishing_time is null,0,fishing_time)) /COUNT(if(fishing_time is null,null,a.user_id))/ 60,2)  as avge_fishing_times, --捕鱼人均时长 
        round(sum(if(game_activity_cg_time is null,0,game_activity_cg_time)) /COUNT(if(game_activity_cg_time is null,null,a.user_id))/ 60,2)  as avge_game_activity_times --捕鱼人均时长          
        FROM (
                SELECT  pt,_id as user_id         
                from sync_mongo_box.extract_box_gamezone_source__userdetails 
                WHERE pt='${date}' and substr(create_time, 1, 10)='${date}'
        ) as a 
        LEFT JOIN 
        (
            SELECT pt,user_id, ddz_times ,fishing_time, majiang_times, game_duration, huangdi_time,game_activity_cg_time
            FROM  sync_mongo_box.extract_box_gamezone_game_source__gamedaystat
            WHERE  pt = '${date}' 
        )as b
        on a.user_id = b.user_id 
        GROUP BY a.pt

)

SELECT games.pt,games.new_add_nums,ROUND((all_game_times+all_pingtai_times) / games.new_add_nums,2) as avge_times,ROUND(all_game_times/games.new_add_nums,2) as avge_game_times,  
       avge_ddz_times,avge_majiang_times,avge_fishing_times,avge_huangdi_times
       ,ROUND(mingame_nums/games.new_add_nums,3) as shentou_mingame ,ROUND(ddz_nums/games.new_add_nums,3) as shentou_ddz
       ,ROUND(mj_nums/games.new_add_nums,3) as shentou_mj,ROUND(fishing_time_nums/games.new_add_nums,3) as shentou_fishing
       ,ROUND(huangdi_time_nums/games.new_add_nums,3) as shentou_huangdi
       ,ROUND(game_activity_cg_nums/games.new_add_nums,3) as shentou_game_activity  
 from games,pingtai,game_times where games.pt = pingtai.pt and games.pt = game_times.pt

专区ROI

--odps sql 
--********************************************************************--
--author:odps-game
--create time:2019-11-18 20:04:53
--********************************************************************--
with 
a as ( -- 平台奖励
        SELECT  pt,user_id
            ,SUM(
                COALESCE(punchcard_a_flash_coin,0) 
                + COALESCE(patchcard_a_flash_coin,0)  
                + COALESCE(dayactivity_a_flash_coin,0) 
                + COALESCE(newperson_a_flash_coin,0) 
                + COALESCE(dailytask_a_flash_coin,0)
                + COALESCE(gu_a_flash_coin,0) -- 瓜分奖励
                + COALESCE(guc_a_flash_coin,0) -- 瓜分安慰奖励
                + COALESCE(p_a_flash_coin,0)  -- 进步奖励
                + COALESCE(pc_a_flash_coin,0) -- 进步安慰奖励 
                + COALESCE(agc_a_flash_coin,0) -- 奖券奖励
                + COALESCE(88173991_agc_a_flash_coin,0) --消消乐
                + COALESCE(88107542_agc_a_flash_coin,0) --摩登大楼
                + COALESCE(88190422_agc_a_flash_coin,0) --爆爆球球
                + COALESCE(88111422_agc_a_flash_coin,0) --球别掉
                + COALESCE(88165662_agc_a_flash_coin,0) --守护飞飞
                + COALESCE(cg_a_flash_coin,0) -- 闯关奖励奖励
                +  COALESCE(giftpackage_0_a_flash_coin,  0)
                +  COALESCE(giftpackage_1_a_flash_coin,  0)
                +  COALESCE(giftpackage_2_a_flash_coin,  0)
                +  COALESCE(giftpackage_3_a_flash_coin,  0)
                +  COALESCE(giftpackage_4_a_flash_coin,  0)
                +  COALESCE(reward_coin,0)
                +  COALESCE(finish_box,  0)*2500
                                                                
            ) AS userdaystat_fishing, 
            SUM(COALESCE(video_count,0)) as patch_card_video
         
        FROM  sync_mongo_box.extract_box_gamezone_source__userdaystat
        WHERE pt BETWEEN '${t_start}' and '${t_end}' 
        and client_version >= '5.4.7.0' and basic_data_center.getbucketid(user_id, 5) BETWEEN '${t_num}' and '${e_num}'  GROUP BY user_id,pt

)
,b as (  --游戏内奖励、回收、视频数、时长
        SELECT pt,user_id,SUM(
                    COALESCE(huangdi_task,0) 
                    + COALESCE(fishing_game_obtain_flash,0)
                    + COALESCE(reward_coin,0)
                    + COALESCE(a_ddz,0)  -- 斗地主奖励
                    + COALESCE(mj_task_flash_coin, 0) -- 麻将游戏内奖励
                ) AS gameuserdaystat_fishing
                ,SUM( 
                    + ABS(COALESCE(fishing_game_consum_flash,0)) --- 捕鱼回收门票
                    + ABS(COALESCE(minigame_need_coin,0)) --- 小游戏门票
                    + ABS(COALESCE(r_ddz,0)) -- 斗地主回收
                ) AS consum_flash
                ,SUM(
                    COALESCE(if (game_duration < 0,0,game_duration),0) 
                    + COALESCE(if (huangdi_time < 0,0,huangdi_time),0) 
                    + COALESCE(if (fishing_time < 0,0,fishing_time),0) 
                    
                    + COALESCE(if (ddz_times < 0,0,ddz_times),0)  --斗地主时长
                    + COALESCE(if (game_activity_cg_time < 0,0,game_activity_cg_time),0) -- 闯关时长 
                    + COALESCE(if (majiang_times < 0,0,majiang_times),0)  -- 麻将时长         
                ) AS game_times
                ,SUM(
                    COALESCE(total_video_count,0) 
                    + COALESCE(fishing_watch_video_times,0) -- 捕鱼看视频数
                    + COALESCE(ddz_watch_video,0) -- 斗地主看视频数
                    + COALESCE(majiang_watch_video, 0) -- 麻将游戏内视频数 
                    + COALESCE(mj_task_video, 0) -- 麻将任务视频
                ) AS game_video
        FROM  sync_mongo_box.extract_box_gamezone_game_source__gamedaystat
        WHERE  pt BETWEEN '${t_start}' and '${t_end}' GROUP BY pt,user_id

)
,c as(  --皇帝视频数
    SELECT  user_id,ngx_date,COUNT(1) AS huangdi_video_count    
    FROM  liquid_log_project.log_box_android_master
    WHERE  ngx_date BETWEEN '${t_start}' and '${t_end}'
    AND  event_name IN ('task_video_success','speed_video_success','box_video_success','offline_video_success')
    AND  GET_JSON_OBJECT(other_column,'$.game_id') = "42104418"    
    GROUP by user_id,ngx_date


),d as(  -- 游戏平台所占时长

    SELECT a.user_id,a.ngx_date,round((SUM(duration)/1000), 2) as total_playtime from 
        (
        SELECT  user_id
                ,duration
                ,ngx_date
        FROM    liquid_log_project.log_box_android_master
        WHERE   ngx_date BETWEEN '${t_start}' and '${t_end}'
        AND     event_name = 'b_leave_page'
        AND     SUBSTR(target_url,1,56) = 'https://saiyan_game_center.liquidnetwork.com/game_center'
        AND     duration < 3600000
        AND     duration > 0

        )a LEFT SEMI JOIN  (
        SELECT  user_id
                ,pt
        FROM    sync_mongo_box.extract_box_gamezone_source__userdaystat
        WHERE   pt BETWEEN '${t_start}' and '${t_end}'
        GROUP BY pt,user_id
        ) b 
        on a.user_id=b.user_id
        and a.ngx_date=b.pt
        GROUP BY a.ngx_date,a.user_id



),f as ( --转圈奖励
    SELECT user_id,pt,SUM(COALESCE(red_envelopes_game_module_flash,0)) as red_game_flash, --游戏专区转圈
                      SUM(COALESCE(red_envelopes_doudizhu_flash,0)) as doudizhu_flash, -- 首页斗地主转圈
                      SUM(COALESCE(third_order_flash_saiyisai,0)) red_zq,  --红包新游戏中心 转圈
                      SUM(COALESCE(games_reward_flash,0)) games_reward_flash,  --游戏激励视频奖励
                      SUM(COALESCE(games_read_count_reward,0)) games_read_count_reward,  --游戏转圈阶梯奖励
                      SUM(COALESCE(size(games_red_reward_y_list),0)) games_red_video_count  --游戏转圈视频数
                      
    from sync_mongo_box.extract_source__userdaystat 
    where pt BETWEEN '${t_start}' and '${t_end}'
    GROUP BY user_id,pt  
)
select  '${t_num}' "--" '${e_num}' as 桶号,
        a.pt,COUNT(a.user_id) AS 日活, --日活

        SUM(red_game_flash) as 转圈奖励, --转圈奖励
        ROUND((SUM(red_game_flash + doudizhu_flash + games_reward_flash + games_read_count_reward)) / COUNT(a.user_id)) as 人均转圈补贴,  --人均转圈补贴

        SUM(userdaystat_fishing+gameuserdaystat_fishing + red_game_flash + doudizhu_flash +red_zq + games_reward_flash + games_read_count_reward) AS 补贴闪电币, --补贴闪电币

        ROUND(
            SUM(userdaystat_fishing+gameuserdaystat_fishing + red_game_flash + doudizhu_flash +red_zq + games_reward_flash +games_read_count_reward - consum_flash) / COUNT(a.user_id)
        ) as 人均补贴,  --人均补贴

        SUM(consum_flash) AS 回收闪电币, --回收闪电币
        SUM(game_times) +SUM(total_playtime) AS 总时长,  --总时长

        ROUND(
            (
                (SUM(game_times) + SUM(total_playtime)) / COUNT(a.user_id) / 60
            )
        ,2) as 人均总时长,  --人均总时长

        SUM(game_times) AS 游戏时长, --游戏时长

        ROUND(
            (SUM(game_times) / COUNT(a.user_id)) / 60
        ,2) as 人均游戏时长,  --人均游戏时长

        SUM(game_video) + sum(huangdi_video_count) +sum(patch_card_video) + sum(games_red_video_count) AS 视频数, --视频数
        
        ROUND(
            (SUM(game_video) + sum(huangdi_video_count) +sum(patch_card_video) + sum(games_red_video_count)) / COUNT(a.user_id)
        ,2) as 人均视频数  --人均视频数



from  a LEFT  join b  on a.user_id = b.user_id and a.pt = b.pt 
        LEFT  join c  on a.user_id = c.user_id and a.pt = c.ngx_date
        LEFT  JOIN d  on a.user_id = d.user_id and a.pt = d.ngx_date
        LEFT  join f  on a.user_id = f.user_id and a.pt = f.pt


GROUP  by a.pt

专区新手任务提现

with  user as (
    SELECT user_id,pt FROM (
        SELECT * from basic_data_center.odps_base_box_user_day_stat
        WHERE pt BETWEEN '${bdatestart}' and '${bdateend}'
        and version_name >='5.4.4.5'
        -- and day_age = 0 --判断新老用户
        and day_age != 0   --老用户
    )a join (
        SELECT pt,user_id FROM  sync_mongo_box.extract_box_gamezone_source__userdaystat where day_age=0
        and pt BETWEEN '${bdatestart}' and '${bdateend}'
    )b on a.user_id = b.user_id and a.pt=b.pt  GROUP by user_id,pt
)
,duration as (  --full join  保证全部用户
SELECT  COALESCE(a.user_id,b.user_id) AS user_id
        ,COALESCE(duration,0)+COALESCE(total_playtime,0) AS allduration  --两部分的时长
        ,COALESCE(a.pt,b.pt) AS pt
FROM    (    --第一部分的时长
            SELECT  user_id
                    ,COALESCE(game_duration,0)+COALESCE(huangdi_time,0)+COALESCE(fishing_time,0)+COALESCE(ddz_times,0)+COALESCE(game_activity_cg_time,0) AS duration
                    ,pt
            FROM    sync_mongo_box.extract_box_gamezone_game_source__gamedaystat
            WHERE   pt BETWEEN '${bdatestart}'
            AND     split_part(DATEADD(CONCAT('${bdateend}',' 00:00:00'), 6,'dd'),' ',1)
        ) a FULL
JOIN    (    --游戏中心的时长
            SELECT  user_id
                    ,ngx_date AS pt
                    ,SUM(duration)/1000 AS total_playtime
            FROM    liquid_log_project.log_box_android_master
            WHERE   ngx_date BETWEEN '${bdatestart}' and split_part(DATEADD(CONCAT('${bdateend}',' 00:00:00'), 6,'dd'),' ',1)
            AND     event_name = 'b_leave_page'
            AND     SUBSTR(target_url,1,56) = 'https://saiyan_game_center.liquidnetwork.com/game_center'
            AND     duration < 3600000
            AND     duration > 0
            AND     user_id IN ( SELECT user_id FROM sync_mongo_box.extract_box_gamezone_source__userdaystat WHERE pt BETWEEN '${bdatestart}' AND '${bdateend}' )
            GROUP BY user_id
                     ,ngx_date
        ) b
ON      a.user_id = b.user_id
AND     a.pt = b.pt
)
,videos as ( --full join  保证全部用户
SELECT  COALESCE(d.user_id,c.user_id) AS user_id
        ,COALESCE(videos,0) +COALESCE(games_red_video_count,0) AS allvideos  --三者相加的视频数
        ,COALESCE(d.pt,c.pt) AS pt
FROM    (
            SELECT  COALESCE(a.user_id,b.user_id) AS user_id
                    ,COALESCE(videos,0) +COALESCE(huangdi_video_count,0) AS videos   --皇帝+其他的视频数
                    ,COALESCE(a.pt,b.pt) AS pt
            FROM    (  --皇帝视频数
                        SELECT  user_id
                                ,ngx_date AS pt
                                ,COUNT(1) AS huangdi_video_count
                        FROM    liquid_log_project.log_box_android_master
                        WHERE   ngx_date BETWEEN '${bdatestart}'
                        AND     split_part(DATEADD(CONCAT('${bdateend}',' 00:00:00'), 1,'dd'),' ',1)
                        AND     event_name IN ('task_video_success','speed_video_success','box_video_success','offline_video_success')
                        AND     GET_JSON_OBJECT(other_column,'$.game_id') = "42104418"
                        GROUP BY user_id
                                 ,ngx_date
                    ) a FULL
            JOIN    ( --其他的视频数
                        SELECT  user_id
                                ,COALESCE(total_video_count,0) +COALESCE(fishing_watch_video_times,0) +COALESCE(ddz_watch_video,0) +COALESCE(majiang_watch_video,0 ) +COALESCE(mj_task_video,0) AS videos
                                ,pt
                        FROM   sync_mongo_box.extract_box_gamezone_game_source__gamedaystat
                        WHERE   pt BETWEEN '${bdatestart}'
                        AND     split_part(DATEADD(CONCAT('${bdateend}',' 00:00:00'), 6,'dd'),' ',1)
                    ) b
            ON      a.user_id = b.user_id
            AND     a.pt = b.pt
        ) d FULL
JOIN    (  --补贴表里的视频数
            SELECT  user_id
                    ,SUM(COALESCE(SIZE(games_red_reward_y_list),0)) games_red_video_count    --游戏转圈视频数
                    ,pt
            FROM    sync_mongo_box.extract_source__userdaystat
            WHERE   pt BETWEEN '${bdatestart}'
            AND     split_part(DATEADD(CONCAT('${bdateend}',' 00:00:00'), 6,'dd'),' ',1)
            group by user_id,pt
        ) c
ON      d.user_id = c.user_id
AND     d.pt = c.pt
)
,subsidy as (
SELECT  COALESCE(a.user_id,b.user_id) AS user_id
        ,COALESCE(a.subsidy,0)+COALESCE(b.subsidy,0) AS allsubsidy --两者的补贴
        ,COALESCE(a.pt,b.pt) AS pt
FROM    (    --第一部分的补贴
            SELECT  user_id
                    ,SUM(red_envelopes_game_module_flash)+SUM(red_envelopes_doudizhu_flash)+SUM(third_order_flash_saiyisai)+SUM(games_reward_flash)+SUM(games_read_count_reward)
                     as subsidy    
                    ,pt
            FROM    sync_mongo_box.extract_source__userdaystat
            WHERE   pt BETWEEN '${bdatestart}'
            AND     split_part(DATEADD(CONCAT('${bdateend}',' 00:00:00'), 6,'dd'),' ',1)
            group by user_id,pt
        ) a FULL
JOIN    (    --第二部分的补贴
            SELECT  COALESCE(a.user_id,b.user_id) AS user_id
                    ,COALESCE(a.subsidy,0) +COALESCE(b.subsidy,0) AS subsidy   --皇帝+其他的视频数
                    ,COALESCE(a.pt,b.pt) AS pt
            FROM    (  
                        SELECT  user_id
                                ,pt
                                ,COALESCE(huangdi_task,0)+COALESCE(fishing_rank_flash,0)+COALESCE(fishing_game_obtain_flash,0)+COALESCE(reward_coin,0)
                                +COALESCE(a_ddz,0) +COALESCE(mj_task_flash_coin,0)-COALESCE(fishing_game_consum_flash,0)-COALESCE(minigame_need_coin,0) 
                                -COALESCE(r_ddz,0) as subsidy
                        FROM    sync_mongo_box.extract_box_gamezone_game_source__gamedaystat
                        WHERE   pt BETWEEN '${bdatestart}'
                        AND     SPLIT_PART(DATEADD(CONCAT('${bdateend}',' 00:00:00'), 6,'dd'),' ',1)
                    ) a FULL
            JOIN    ( --其他的补贴
                        SELECT  user_id
                                ,pt
                                ,COALESCE(punchcard_a_flash_coin,0)+COALESCE(patchcard_a_flash_coin,0)+COALESCE(dayactivity_a_flash_coin,0)+COALESCE(newperson_a_flash_coin,0)
                                +COALESCE(dailytask_a_flash_coin,0) +COALESCE(gu_a_flash_coin,0)+COALESCE(guc_a_flash_coin,0)+COALESCE(p_a_flash_coin,0) 
                                +COALESCE(pc_a_flash_coin,0) +COALESCE(agc_a_flash_coin,0) +COALESCE(88173991_agc_a_flash_coin,0)+COALESCE(88107542_agc_a_flash_coin,0)+COALESCE(88190422_agc_a_flash_coin,0) 
                                +COALESCE(88111422_agc_a_flash_coin,0) +COALESCE(88165662_agc_a_flash_coin,0) +COALESCE(cg_a_flash_coin,0)+COALESCE(giftpackage_0_a_flash_coin,0)+COALESCE(giftpackage_1_a_flash_coin,0) 
                                +COALESCE(giftpackage_2_a_flash_coin,0) +COALESCE(giftpackage_3_a_flash_coin,0) +COALESCE(giftpackage_4_a_flash_coin,0)+COALESCE(reward_coin,0)+COALESCE(finish_box,0)*2500 
                                as subsidy
                        FROM    sync_mongo_box.extract_box_gamezone_source__userdaystat
                        WHERE   pt BETWEEN '${bdatestart}'
                        AND     SPLIT_PART(DATEADD(CONCAT('${bdateend}',' 00:00:00'), 6,'dd'),' ',1)                      
                    ) b
            ON      a.user_id = b.user_id
            AND     a.pt = b.pt
        ) b
ON      a.user_id = b.user_id
AND     a.pt = b.pt
)
,last_duration as (
SELECT  user.pt
        ,CASE    WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 0 AND 84 THEN 'A'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 85 AND 89 THEN 'B'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 90 AND 94 THEN 'C'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 95 AND 99 THEN 'D' 
                 ELSE 'E' 
         END AS bucket_type
          , sum(if(DATEDIFF(to_date(duration.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )=0,1,0)) as newuser --新增人数
          , sum(if(DATEDIFF(to_date(duration.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )=0,allduration,0)) as duration0 --当日总时长
          , sum(if(DATEDIFF(to_date(duration.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )BETWEEN 0 and 2,allduration,0)) as duration3 --三日内时长
          , sum(if(DATEDIFF(to_date(duration.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )BETWEEN 0 and 6,allduration,0)) as duration7 --七日内时长
FROM    user LEFT
JOIN    duration
ON      user.user_id = duration.user_id
GROUP BY user.pt
         ,CASE    WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 0 AND 84 THEN 'A'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 85 AND 89 THEN 'B'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 90 AND 94 THEN 'C'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 95 AND 99 THEN 'D' 
                  ELSE 'E' 
          END
)
,last_videos as (
SELECT  user.pt
        ,CASE    WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 0 AND 84 THEN 'A'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 85 AND 89 THEN 'B'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 90 AND 94 THEN 'C'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 95 AND 99 THEN 'D' 
                 ELSE 'E' 
         END AS bucket_type
          , sum(if(DATEDIFF(to_date(videos.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )=0,allvideos,0)) as videos0 --当日总时长
          , sum(if(DATEDIFF(to_date(videos.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )BETWEEN 0 and 2,allvideos,0)) as videos3 --三日内时长
          , sum(if(DATEDIFF(to_date(videos.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )BETWEEN 0 and 6,allvideos,0)) as videos7 --七日内时长
FROM    user LEFT
JOIN    videos
ON      user.user_id = videos.user_id
GROUP BY user.pt
         ,CASE    WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 0 AND 84 THEN 'A'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 85 AND 89 THEN 'B'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 90 AND 94 THEN 'C'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 95 AND 99 THEN 'D' 
                  ELSE 'E' 
          END
)
,last_subsidy as (
SELECT  user.pt
        ,CASE    WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 0 AND 84 THEN 'A'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 85 AND 89 THEN 'B'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 90 AND 94 THEN 'C'
                 WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 95 AND 99 THEN 'D' 
                 ELSE 'E' 
         END AS bucket_type
          , sum(if(DATEDIFF(to_date(subsidy.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )=0,allsubsidy,0)) as subsidy0 --当日总时长
          , sum(if(DATEDIFF(to_date(subsidy.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )BETWEEN 0 and 2,allsubsidy,0)) as subsidy3 --三日内时长
          , sum(if(DATEDIFF(to_date(subsidy.pt,'yyyy-mm-dd'),TO_DATE(user.pt,'yyyy-mm-dd'),'dd' )BETWEEN 0 and 6,allsubsidy,0)) as subsidy7 --七日内时长
FROM    user LEFT
JOIN    subsidy
ON      user.user_id = subsidy.user_id
GROUP BY user.pt
         ,CASE    WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 0 AND 84 THEN 'A'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 85 AND 89 THEN 'B'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 90 AND 94 THEN 'C'
                  WHEN basic_data_center.getbucketid(user.user_id, 11) BETWEEN 95 AND 99 THEN 'D' 
                  ELSE 'E' 
          END
)
SELECT 
last_duration.pt as 日期
,last_duration.bucket_type as 分桶情况
,newuser as 新增人数
,ROUND(duration0/newuser,2)/60  as 当日人均时长分
, ROUND(subsidy0/newuser,2)/100000  as 当日人均补贴元
, ROUND(videos0/newuser,2)  as 当日人均视频数
, ROUND(duration3/newuser,2)/60   as 三日人均时长分
, ROUND(subsidy3/newuser,2)/100000  as 三日人均补贴元
, ROUND(videos3/newuser,2)  as 三日人均视频数
, ROUND(duration7/newuser,2)/60   as 七日人均时长分
, ROUND(subsidy7/newuser,2)/100000   as 七日人均补贴元
, ROUND(videos7 /newuser,2)  as 七日人均视频数
from last_duration,last_videos,last_subsidy
WHERE  last_duration.pt =last_videos.pt and last_duration.bucket_type =last_videos.bucket_type
and last_duration.pt =last_subsidy.pt and last_duration.bucket_type =last_subsidy.bucket_type;

活跃留存模版

--odps sql 
--********************************************************************--
--author:odps-game
--create time:2019-11-21 16:22:46
--********************************************************************--

with user_t as(
        select pt,user_id from workspace_saiyisai.odps_calc_user_roi 
        where pt between '${date_start}' AND '${date_end}'
    ),
    userdaystat as(
        select pt,user_id from workspace_saiyisai.odps_calc_user_roi 
        where pt between '${date_start}' AND  SUBSTR(DATEADD(TO_DATE('${date_end}','yyyy-mm-dd'),14,'dd'),1,10)
    )
select 
    CASE  
    -- 实验分桶修改 start
    WHEN basic_data_center.getbucketid(user_t.user_id,'8') BETWEEN 0 AND 5 THEN "a"
    WHEN basic_data_center.getbucketid(user_t.user_id,'8') BETWEEN 6 AND 10 THEN "b"
    WHEN basic_data_center.getbucketid(user_t.user_id,'8') BETWEEN 6 AND 10 THEN "b"
    WHEN basic_data_center.getbucketid(user_t.user_id,'8') BETWEEN 6 AND 10 THEN "b"
    -- 实验分桶修改 end
    END AS 策略,
    user_t.pt as 日期,
    count(distinct user_t.user_id) 活跃,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 1, 1, 0)
    ) 留存1,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 3, 1, 0)
    ) 留存3,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 7, 1, 0)
    ) 留存7,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 10, 1, 0)
    ) 留存10,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 14, 1, 0)
    ) 留存14,

    ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 1, 1, 0)
        ) /
        count(distinct user_t.user_id)
       ,3
    ) as 留存1率,

    ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 3, 1, 0)
        ) /
        count(distinct user_t.user_id)
        ,3
    ) as 留存3率,

    ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 7, 1, 0)
        ) /
        count(distinct user_t.user_id)
        ,3
    ) as 留存7率,
    ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 10, 1, 0)
        ) /
        count(distinct user_t.user_id)
        ,3
    ) as 留存10率,
        ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 14, 1, 0)
        ) /
        count(distinct user_t.user_id)
        ,3
    ) as 留存14率

    from user_t LEFT JOIN userdaystat
    on user_t.user_id = userdaystat.user_id
    group by user_t.pt,
    
    -- 实验分桶修改 start
    CASE WHEN basic_data_center.getbucketid(user_t.user_id,'') BETWEEN 0 AND 99 THEN "20-99"
    

    -- 实验分桶修改 end
    END;

全量ROI模版

-- --odps sql 
-- --********************************************************************--
-- --author:odps-game
-- --create time:2019-11-21 15:50:26
-- --********************************************************************--



select  pt, 
        CASE 
        -- 实验分桶修改 start
  
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 0 AND 9 THEN '跳一跳' 
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 10 AND 19 THEN '箭头'
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 20 AND 99 THEN '对照组'

        -- 实验分桶修改 end
        END AS 策略,
        count(1) as 日活,round(sum(video_count) / count(1),2) as 人均视频数,
        round(sum(times) / count(1),3) as 人均时长,round(sum(max_flash_coin + red_coin) / count(1),3) as 人均补贴,
        round(sum(income) / count(1),3) as 人均收入,ROUND(sum(possible_reward) / count(1),3) as 人均可提补贴 
        from workspace_saiyisai.odps_calc_user_roi  where pt between "${sdate}"
        and "${edate}"  
        GROUP by pt,CASE 

         -- 实验分桶修改 start
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 0 AND 9 THEN '跳一跳' 
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 10 AND 19 THEN '箭头'
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 20 AND 99 THEN '对照组'
         -- 实验分桶修改 end
    
        END;

实验LTV模版

--odps sql 
--********************************************************************--
--author:odps-read
--create time:2019-11-25 14:08:06
--********************************************************************--
with 
userdaystat as (
    select pt,user_id from workspace_saiyisai.odps_calc_user_roi 
    where pt between '${date_start}' AND '${date_end}'
    and box_day_age = 0 and  client_version >= "5.4.4.5" and day_age = 0 
),

odps_calc_user_roi as ( --roi user表
select * from workspace_saiyisai.odps_calc_user_roi 
where pt between '${date_start}' AND SUBSTR(DATEADD(TO_DATE('${date_end}','yyyy-mm-dd'),7,'dd'),1,10)
)

SELECT userdaystat.pt AS 日期
,CASE 

-- 实验分桶修改 start
WHEN basic_data_center.getbucketid(userdaystat.user_id,'${bucket_num}') BETWEEN 0 AND 84 THEN '对照' 
WHEN basic_data_center.getbucketid(userdaystat.user_id,'${bucket_num}') BETWEEN 85 AND 89 THEN '改版'
WHEN basic_data_center.getbucketid(userdaystat.user_id,'${bucket_num}') BETWEEN 90 AND 94 THEN '提现'
WHEN basic_data_center.getbucketid(userdaystat.user_id,'${bucket_num}') BETWEEN 95 AND 99 THEN '改版+提现'
-- 实验分桶修改 end

END AS 策略


,sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 )) as 新增总人数

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,times,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
/60
,3
)as 新增人均时长

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,max_flash_coin+red_coin,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 新增人均补贴

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,possible_reward,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 新增人均可提补贴
,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,income,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 新增人均收入


,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,video_count,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 新增人均视频数

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2 ,times,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
/60
,3
)as 3日人均时长

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2 ,max_flash_coin+red_coin,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 3日人均补贴

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2 ,video_count,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 3日人均视频数
,round(

sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2 ,possible_reward,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 3日人均可提补贴
,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 2,income,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 3日人均收入

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 6 ,times,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
/60
,3
)as 7日人均时长

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 6 ,max_flash_coin+red_coin,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 7日人均补贴

,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 6 ,video_count,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 7日人均视频数
,round(

sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 6 ,possible_reward,0 ))

/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 7日人均可提补贴
,round(
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd') BETWEEN 0 and 6,income,0 ))
/
sum(if(DATEDIFF(to_date(odps_calc_user_roi.pt,'yyyy-mm-dd'),to_date(userdaystat.pt,'yyyy-mm-dd'),'dd')=0,1,0 ))
,3
)
as 7日人均收入

FROM userdaystat
,odps_calc_user_roi
WHERE userdaystat.user_id = odps_calc_user_roi.user_id
GROUP BY userdaystat.pt,
CASE 

-- 实验分桶修改 start

WHEN basic_data_center.getbucketid(userdaystat.user_id,'${bucket_num}') BETWEEN 0 AND 84 THEN '对照' 
WHEN basic_data_center.getbucketid(userdaystat.user_id,'${bucket_num}') BETWEEN 85 AND 89 THEN '改版'
WHEN basic_data_center.getbucketid(userdaystat.user_id,'${bucket_num}') BETWEEN 90 AND 94 THEN '提现'
WHEN basic_data_center.getbucketid(userdaystat.user_id,'${bucket_num}') BETWEEN 95 AND 99 THEN '改版+提现'

-- 实验分桶修改 end
END;

新增留存模版

--odps sql 
--********************************************************************--
--author:odps-game
--create time:2019-11-21 16:22:46
--********************************************************************--

with user_t as(
        select pt,user_id from workspace_saiyisai.odps_calc_user_roi 
        where pt between '${date_start}' AND '${date_end}' and day_age = 0
    ),
    userdaystat as(
        select pt,user_id from workspace_saiyisai.odps_calc_user_roi 
        where pt between '${date_start}' AND SUBSTR(DATEADD(TO_DATE('${date_end}','yyyy-mm-dd'),14,'dd'),1,10)
    )
select 
    CASE 
    -- 实验分桶修改 start
    
    WHEN basic_data_center.getbucketid(user_t.user_id,'') BETWEEN 0 AND 99 THEN "20-99"
 
    -- 实验分桶修改 end
    END AS 策略,
    user_t.pt as 日期,
    count(distinct user_t.user_id) 新增,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 1, 1, 0)
    ) 留存1,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 3, 1, 0)
    ) 留存3,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 7, 1, 0)
    ) 留存7,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 10, 1, 0)
    ) 留存10,
    sum(
        if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 14, 1, 0)
    ) 留存14,

    ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 1, 1, 0)
        ) /
         count(distinct user_t.user_id)
        ,3
    ) as 留存1率,

    ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 3, 1, 0)
        ) /
       count(distinct user_t.user_id
        ),3
    ) as 留存3率,

    ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 7, 1, 0)
        ) /
        count(distinct user_t.user_id)
        ,3
    ) as 留存7率,
    ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 10, 1, 0)
        ) /
        count(distinct user_t.user_id)
        ,3
    ) as 留存10率,
        ROUND(
        sum(
            if (DATEDIFF(CONCAT(userdaystat.pt, ' 00:00:00'), CONCAT(user_t.pt, ' 00:00:00'), 'dd') = 14, 1, 0)
        ) /
        count(distinct user_t.user_id)
        ,3
    ) as 留存14率


    from user_t LEFT join userdaystat
    on user_t.user_id = userdaystat.user_id
    and userdaystat.pt in (
        SUBSTR(DATEADD(TO_DATE(user_t.pt,'yyyy-mm-dd'),1,'dd'),1,10),
        SUBSTR(DATEADD(TO_DATE(user_t.pt,'yyyy-mm-dd'),3,'dd'),1,10),
        SUBSTR(DATEADD(TO_DATE(user_t.pt,'yyyy-mm-dd'),7,'dd'),1,10),
        SUBSTR(DATEADD(TO_DATE(user_t.pt,'yyyy-mm-dd'),10,'dd'),1,10),
        SUBSTR(DATEADD(TO_DATE(user_t.pt,'yyyy-mm-dd'),14,'dd'),1,10)
    )
    group by user_t.pt,
    CASE  
    -- 实验分桶修改 start
    WHEN basic_data_center.getbucketid(user_t.user_id,'') BETWEEN 0 AND 99 THEN "20-99"
 
    -- 实验分桶修改 end
    END;

新增ROI模版

-- --odps sql 
-- --********************************************************************--
-- --author:odps-game
-- --create time:2019-11-21 14:47:44
-- --********************************************************************--


select  pt, CASE 
        -- 实验分桶修改 start 
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 0 AND 9 THEN '跳一跳' 
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 10 AND 19 THEN '箭头'
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 20 AND 99 THEN '对照组'
        -- 实验分桶修改 end
        END AS 策略,
        count(1) as 日活,round(sum(video_count) / count(1),2) as 人均视频数,
        round(sum(times) / count(1),3) as 人均时长,round(sum(max_flash_coin + red_coin) / count(1),3) as 人均补贴,
        round(sum(income) / count(1),3) as 人均收入,ROUND(sum(possible_reward) / count(1),3) as 人均可提补贴 
        from workspace_saiyisai.odps_calc_user_roi  where pt between "${sdate}"
        and "${edate}" and day_age = 0
        GROUP by pt,CASE 
        -- 实验分桶修改 start
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 0 AND 9 THEN '跳一跳' 
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 10 AND 19 THEN '箭头'
        WHEN basic_data_center.getbucketid(user_id,'${bucket_num}') BETWEEN 20 AND 99 THEN '对照组'
        -- 实验分桶修改 end
        END;
原文地址:https://www.cnblogs.com/zhaoyingjie/p/12457997.html