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!