ai_member_xiaoxi/scripts/用户购课完课统计.sql
2026-04-14 08:00:01 +08:00

390 lines
11 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 用户购课完课情况统计脚本
-- 统计范围已支付金额≥498元的有效订单用户
-- 输出字段账号ID、角色ID、激活课包、性别、年龄、省市、账号/角色创建日期、购课信息、L1/L2最新完课信息
select c.account_id as "账号ID"
,c.id as "角色ID"
,c.purchase_season_package as "激活课包"
,c.gender as "角色性别"
,2026 - cast(c.birthday as int) as "角色年龄"
,f.account_province as "角色省"
,f.account_city as "角色市"
,a.account_created_date as "账号创建日期"
,c.character_created_date as "角色创建日期"
,b.goods_name as "课包"
,b.key_from as "购课渠道"
,b.pay_date as "购课日期"
,d.chapter_name_L1 as "L1课程名称"
,d.finish_date_L1 as "L1完课日期"
,d.gap_date_L1 as "L1距离上次完课间隔"
,e.chapter_name_L2 as "L2课程名称"
,e.finish_date_L2 as "L2完课日期"
,e.gap_date_L2 as "L2距离上次完课间隔"
from
(
select id
,to_char(created_at,'YYYY-MM-DD') as account_created_date
from bi_vala_app_account
where status = 1
group by id
,created_at
) as a
left join
(
select account_id
,goods_name
,key_from
,to_char(pay_success_date,'YYYY-MM-DD') as pay_date
from bi_vala_order
where pay_amount_int > 49800
and order_status = 3
group by account_id
,goods_name
,key_from
,pay_success_date
) as b on a.id = b.account_id
left join
(
select id
,account_id
,case when purchase_season_package in ('[1,16,17,18,19,20,2,12,13,14]','[1,16,2,12,13,14,17,18,19,20]','[1,2,12,13,14,17,18,19,20]','[16,1,17,18,19,20,2,12,13,14]','[16,1,2,12,13,14,17,18,19,20]','[16,17,18,19,20,1,2,12,13,14]','[1,2,12,13,14,16,17,18,19,20]') then 'L1和L2'
when purchase_season_package in ('[1,16,17,18,19,20]','[16,1,17,18,19,20]','[16,17,18,19,20]','[16,17,18,19,20,1]') then 'L1'
when purchase_season_package in ('[1,16,17]','[16,1,17]','[16,17]','[16,17,1]') then 'L1S1'
when purchase_season_package in ('[1,16,2,12,13,14,17]') then 'L1S1和L2'
when purchase_season_package in ('[1,16,2,12,13,14]','[1,2,12,13,14,16]' ,'[1,2,12,13,14]','[16,1,2,12,13,14]') then 'L2'
when purchase_season_package in ('[1,16,2]','[1,2,16]','[1,2]','[16,1,2]') then 'L2S1'
when purchase_season_package in ('[1,2,12]') then 'L2S1和L2S2'
when purchase_season_package in ('[1,16,17,18,19,20,2]') then 'L1和L2S1'
when purchase_season_package in ('[1,16]','[1]','[16]','[16,1]','[]') then '没激活'
else purchase_season_package
end as purchase_season_package
,to_char(created_at,'YYYY-MM-DD') as character_created_date
,case when gender = 0 then ''
when gender = 1 then ''
else '未知'
end as gender
,case when split_part(birthday,'-',1) = '' then '0000'
else split_part(birthday,'-',1)
end as birthday
from bi_vala_app_character
where deleted_at is NULL
group by id
,account_id
,purchase_season_package
,created_at
,gender
,birthday
) as c on b.account_id = c.account_id
left join
(
select user_id
,finish_date as finish_date_L1
,gap_date as gap_date_L1
,chapter_name as chapter_name_L1
from
(
select user_id
,finish_date
,gap_date
,chapter_name
,rank () over (partition by user_id order by finish_date desc) as rankno
from
(
select user_id
,finish_date
,current_date - finish_date_1 as gap_date
,format('%s-%s-%s-%s',course_level,course_season,course_unit,course_lesson) as chapter_name
,rank () over (partition by user_id order by format('%s-%s-%s-%s',course_level,course_season,course_unit,course_lesson) desc) as rankno
from
(
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_0
where play_status = 1
and chapter_id > 331
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_1
where play_status = 1
and chapter_id > 331
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_2
where play_status = 1
and chapter_id > 331
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_3
where play_status = 1
and chapter_id > 331
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_4
where play_status = 1
and chapter_id > 331
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_5
where play_status = 1
and chapter_id > 331
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_6
where play_status = 1
and chapter_id > 331
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_7
where play_status = 1
and chapter_id > 331
group by user_id
,chapter_id
,updated_at
) as x
left join
(
select cast(id as int) as id
,course_level
,course_season
,course_unit
,course_lesson
from bi_level_unit_lesson
group by id
,course_level
,course_season
,course_unit
,course_lesson
) as y on x.chapter_id = y.id
group by user_id
,finish_date_1
,finish_date
,chapter_id
,course_level
,course_season
,course_unit
,course_lesson
)
where rankno = 1
group by user_id
,finish_date
,gap_date
,chapter_name
)
where rankno = 1
) as d on c.id = d.user_id
left join
(
select user_id
,finish_date as finish_date_L2
,gap_date as gap_date_L2
,chapter_name as chapter_name_L2
from
(
select user_id
,finish_date
,gap_date
,chapter_name
,rank () over (partition by user_id order by finish_date desc) as rankno
from
(
select user_id
,finish_date
,current_date - finish_date_1 as gap_date
,format('%s-%s-%s-%s',course_level,course_season,course_unit,course_lesson) as chapter_name
,rank () over (partition by user_id order by format('%s-%s-%s-%s',course_level,course_season,course_unit,course_lesson) desc) as rankno
from
(
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_0
where play_status = 1
and chapter_id < 332
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_1
where play_status = 1
and chapter_id < 332
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_2
where play_status = 1
and chapter_id < 332
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_3
where play_status = 1
and chapter_id < 332
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_4
where play_status = 1
and chapter_id < 332
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_5
where play_status = 1
and chapter_id < 332
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_6
where play_status = 1
and chapter_id < 332
group by user_id
,chapter_id
,updated_at
union all
select user_id
,chapter_id
,to_char(updated_at,'YYYY-MM-DD') as finish_date
,date(updated_at) as finish_date_1
from bi_user_chapter_play_record_7
where play_status = 1
and chapter_id < 332
group by user_id
,chapter_id
,updated_at
) as x
left join
(
select cast(id as int) as id
,course_level
,course_season
,course_unit
,course_lesson
from bi_level_unit_lesson
group by id
,course_level
,course_season
,course_unit
,course_lesson
) as y on x.chapter_id = y.id
group by user_id
,finish_date_1
,finish_date
,chapter_id
,course_level
,course_season
,course_unit
,course_lesson
)
where rankno = 1
group by user_id
,finish_date
,gap_date
,chapter_name
)
where rankno = 1
) as e on c.id = e.user_id
left join
(
select account_id
,split_part(login_address,'-',1) as account_province
,split_part(login_address,'-',2) as account_city
from account_detail_info
group by account_id
,login_address
) as f on c.account_id = f.account_id
group by c.account_id
,c.id
,c.purchase_season_package
,c.gender
,c.birthday
,f.account_province
,f.account_city
,a.account_created_date
,c.character_created_date
,b.goods_name
,b.key_from
,b.pay_date
,d.chapter_name_L1
,d.finish_date_L1
,d.gap_date_L1
,e.chapter_name_L2
,e.finish_date_L2
,e.gap_date_L2
order by b.key_from
,b.pay_date;