# 业务知识库总结

## 整体业务理解

### 公司业务模式
这是一个在线教育产品，主要提供 L1/L2 级别的英语学习课程。

### 核心业务流程
1. **用户获取**：用户通过各个渠道下载 App 并注册
2. **用户激活**：用户创建角色，填写性别、生日等信息
3. **用户转化**：用户通过站内或站外渠道购课
4. **用户学习**：用户学习课程，完成课时
5. **数据回收**：收集用户学习行为数据，用于分析和优化

---

## 核心数据模型

### 1. 用户层
**表**：`bi_vala_app_account`
- 记录用户注册信息
- 关键字段：id, created_at, download_channel, key_from, status
- 筛选条件：status=1, deleted_at IS NULL, 排除测试用户ID

### 2. 用户详情层
**表**：`account_detail_info`
- 记录用户的详细信息
- 关键字段：account_id, login_address, phone_login_times
- login_address 格式："省份-城市"

### 3. 角色层
**表**：`bi_vala_app_character`
- 一个用户可以有多个角色
- 关键字段：id, account_id, gender, birthday, purchase_season_package, created_at
- 性别映射：0=girl, 1=boy, 其他=unknow
- 赛季包状态：'[1]'=未购买，其他=已购买

### 4. 订单层
**表**：`bi_vala_order`
- 记录用户购课订单
- 关键字段：account_id, sale_channel, key_from, pay_success_date, pay_amount, pay_amount_int, order_status, goods_name
- 有效订单筛选：order_status=3 AND pay_amount_int>49800
- 购课渠道：17个渠道映射

### 5. 课程层
**表**：`bi_level_unit_lesson`
- 课程体系映射表
- 课程层级结构：course_level (L1/L2) → course_season (S0-S4) → course_unit (U00-U48) → course_lesson (L1-L5)
- chapter_id 映射到完整的课程ID

### 6. 学习行为层
**表**：`bi_user_chapter_play_record_0~7`（8个分表）
- 记录用户的课程播放记录
- 关键字段：user_id, chapter_id, chapter_unique_id, play_status, updated_at, created_at
- play_status=1 表示播放完成
- 需要用 UNION ALL 合并8个分表

**表**：`bi_user_component_play_record_0~7`（8个分表）
- 记录用户的组件播放记录（更细粒度）
- 关键字段：chapter_unique_id, interval_time（毫秒）
- 用于计算完课耗时

---

## 核心业务指标

### 1. 用户指标
- **新增注册用户数**：按日期、渠道统计
- **用户画像**：性别、年龄、地域分布

### 2. 转化指标
- **转化率**：注册 → 购课的转化
- **购课标签**：未购课、站外购课、站内购课
- **退费率**：订单退费情况

### 3. 收入指标
- **GMV**：成交总额，按渠道、日期统计
- **购课金额**：客单价分析

### 4. 学习行为指标
- **课程进入完成率**：进入课程 → 完成课程的转化
- **平均通关时长**：课程完课平均时间
- **学习进度**：用户完课的课程数量和顺序
- **完课间隔**：距离上次完课的时间

---

## 常用分析模式

### 1. 用户全链路分析
将用户、角色、订单、课程完课数据关联，形成宽表，用于综合分析。

### 2. 渠道分析
按 download_channel 或 sale_channel 分组，分析不同渠道的用户质量和转化效果。

### 3. 课程分析
分析不同课程的完课率、完课时长，识别热门课程和难点课程。

### 4. 时间序列分析
按日期分组，分析用户增长、收入、学习行为的趋势变化。

---

## 常见筛选条件

### 测试用户排除
```sql
id not in (51, 2121, 1386, 1397, ...)
```

### 有效订单
```sql
order_status = 3 
AND pay_amount_int > 49800
```

### 有效用户
```sql
status = 1 
AND deleted_at IS NULL
```

### 完课记录
```sql
play_status = 1
```

---

## 数据处理技巧

### 1. 分表合并
使用 UNION ALL 合并8个分表：
```sql
select * from bi_user_chapter_play_record_0
union all
select * from bi_user_chapter_play_record_1
-- ... 其他6个表
```

### 2. 渠道映射
使用 CASE WHEN 将数字编码映射为渠道名称。

### 3. 时间处理
- 使用 `date()` 或 `to_char()` 提取日期
- 使用 `interval_time/1000/60` 将毫秒转为分钟

### 4. 去重逻辑
使用 `rank() over (partition by ... order by ...)` 取第一条记录。
