TikTok OA 最近越来越卷了,尤其是数据、后端、广告相关岗位,SQL 题几乎成了必考项,而且基本都围绕真实的广告业务场景来出题。最近我们刚好带了一场 TikTok OA,结合我们在多场 tiktok面经 和学员辅导中的总结经验,把这套高频 SQL 题型系统性地拆解了一遍,涵盖常见考点、完整解题思路、示例代码以及容易踩的坑,帮大家在 OA 阶段尽量少走弯路。

先搞懂数据基础:表结构与样例数据
要解决这些问题,首先得清楚我们面对的是什么数据。TikTok 这边有个叫ttam_logger的表,专门记录广告主创建广告时的各类操作,字段很清晰:
- date:事件日期,主要用来做数据分区,格式是 YYYYMMDD(比如 20220101 就是 2022 年 1 月 1 日);
- timestamp:精确到秒的事件时间,比如 2022-01-01 08:00:00;
- advertiser_id:广告主唯一 ID,能区分不同用户;
- event:操作类型,常见的有 enter(进入页面)、next(下一步)、back(返回)、submit(提交);
- page:操作发生的页面,比如 objective(目标设置页)、adgroup(广告组配置页)、creative(创意设计页)。
给大家放个真实的样例数据,一看就懂:
| date | timestamp | advertiser_id | event | page |
|---|---|---|---|---|
| 20220101 | 2022-01-01 08:00:00 | 1001 | enter | objective |
| 20220101 | 2022-01-01 08:01:30 | 1001 | next | adgroup |
| 20220101 | 2022-01-01 08:02:45 | 1001 | next | creative |
| 20220101 | 2022-01-01 08:05:00 | 1001 | submit | creative |
| 20220101 | 2022-01-01 09:10:00 | 1002 | enter | objective |
| 20220101 | 2022-01-01 09:12:30 | 1002 | back | objective |
| 20220101 | 2022-01-01 09:15:00 | 1002 | submit | adgroup |
| 20220102 | 2022-01-02 10:00:00 | 1003 | enter | objective |
| 20220102 | 2022-01-02 10:20:00 | 1003 | submit | summary |
逐题拆解:思路 + SQL 代码,新手也能看懂
问题 1:2022 年 1 月 1 日共产生多少次提交操作?
这道题是送分题,核心就是 “筛选 + 计数”。首先锁定日期 20220101,再筛选事件类型是 submit 的记录,最后统计条数就行。
SQL 代码:
SELECT SUM(CASE WHEN event = 'submit' THEN 1 ELSE 0 END) AS submit_count
FROM ttam_logger
WHERE date = '20220101';
问题 2:2022 年 1 月 8 日 – 1 月 14 日这一周的整体提交率是多少?
提交率不是 “提交次数 / 总事件数”!这里要注意 TikTok 的业务定义:提交率 = 该周提交事件总数 ÷ 该周独立会话数。而 “独立会话” 是按 “广告主 ID + 日期” 来算的 —— 同一个广告主同一天的所有操作算一个会话,不管他点了多少次 next 或 back。
解题步骤:
- 统计该周 submit 事件的总次数;
- 统计该周 “advertiser_id+date” 的唯一组合数(即独立会话数);
- 两者相除,保留 4 位小数(业务中通常需要精确到千分位)。
SQL 代码:
SELECT
SUM(CASE WHEN event = 'submit' THEN 1 ELSE 0 END) AS week_submit_count,
COUNT(DISTINCT advertiser_id, date) AS unique_sessions,
ROUND(SUM(CASE WHEN event = 'submit' THEN 1 ELSE 0 END) / COUNT(DISTINCT advertiser_id, date), 4) AS submit_rate
FROM ttam_logger
WHERE date BETWEEN '20220108' AND '20220114';
问题 3:1 月 8 日 – 14 日提交过的广告主中,多少人上周(1 月 1 日 – 7 日)也提交过?
这道题考的是 “用户重合度”,核心是找两个时间段提交用户的交集。用 CTE(公共表表达式)先分别提取两周的提交用户,再用 JOIN 找共同用户,最后计数就行,逻辑很清晰。
WITH week1_submitters AS (
-- 上周提交的广告主(去重)
SELECT DISTINCT advertiser_id
FROM ttam_logger
WHERE date BETWEEN '20220101' AND '20220107'
AND event = 'submit'
),
week2_submitters AS (
-- 本周提交的广告主(去重)
SELECT DISTINCT advertiser_id
FROM ttam_logger
WHERE date BETWEEN '20220108' AND '20220114'
AND event = 'submit'
)
-- 统计两周都提交的广告主数量
SELECT COUNT(DISTINCT week1_submitters.advertiser_id) AS repeat_submit_advertisers
FROM week1_submitters
JOIN week2_submitters
ON week1_submitters.advertiser_id = week2_submitters.advertiser_id;
问题 4:某广告主在指定日期当天在网站上花了多长时间?
这个问题的核心是 “计算单个用户单日的操作时间跨度”—— 从他当天第一次操作到最后一次操作的时间差。按 advertiser_id 和 date 分组,取每组的最小 timestamp(第一次操作)和最大 timestamp(最后一次操作),再用 TIMESTAMPDIFF 函数计算秒数就行。
SELECT
advertiser_id,
date,
TIMESTAMPDIFF(SECOND, MIN(timestamp), MAX(timestamp)) AS seconds_spent
FROM ttam_logger
GROUP BY advertiser_id, date;
实战小贴士:这些坑要避开
- 日期格式:TikTok 的 date 字段是 YYYYMMDD 格式,筛选时别写成 “2022-01-01”,否则会查不到数据;
- 去重时机:统计用户数或会话数时,一定要先去重(DISTINCT),不然会夸大基数,导致结果错误;
- 提交率定义:不同公司对 “提交率” 的定义可能不一样,面试时如果不确定,一定要先跟面试官确认业务逻辑,再动手写 SQL;
- 时长单位:TIMESTAMPDIFF 可以选 SECOND(秒)、MINUTE(分钟)、HOUR(小时),根据需求调整,面试时最好问清楚输出单位。
ProgramHelp 2025 最新上岸学员实战案例
这位学员是拥有 3 年经验的 Data Analyst,技术基础扎实但在面对 Big Tech(如 TikTok, Netflix)的 Online Assessment (OA) 时常因紧张导致发挥失常。
找到 ProgramHelp 后,我们为其提供了OA全流程无痕辅助。在本次 TikTok 面试中,学员在我们的专家助攻下,不仅完美解出所有 SQL 题目,还因代码逻辑清晰、零查重率(Plagiarism Free)获得了面试官的高度评价,顺利拿下 Offer!