• 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;
  • 相关阅读:
    Tampermonkey 油猴脚本开发 入门
    k8s 上安装 lamp 环境
    centOS 7.9 k8s 安装 和 基本命令
    力扣59-螺旋矩阵 II
    力扣54-螺旋矩阵
    力扣705-设计哈希集合
    力扣706-设计哈希映射
    scrapy参数-COOKIES_ENABLED
    优雅降级、渐进增强
    e-cahr的地图组件封装(浙江省为例)
  • 原文地址:https://www.cnblogs.com/zhaoyingjie/p/12457997.html
Copyright © 2020-2023  润新知