TikTok面经 | TikTok OA | SQL 高频题详解 + 准备指南

1,330Views

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

TikTok面经  | TikTok OA | SQL 高频题详解 + 准备指南

先搞懂数据基础:表结构与样例数据

要解决这些问题,首先得清楚我们面对的是什么数据。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。

解題步驟

  1. 統計該周 submit 事件的總次數;
  2. 統計該周 “advertiser_id+date” 的唯一組合數(即獨立會話數);
  3. 兩者相除,保留 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;

實戰小貼士:這些坑要避開

  1. 日期格式:TikTok 的 date 欄位是 YYYYMMDD 格式,篩選時別寫成 “2022-01-01”,否則會查不到資料;
  2. 去重時機:統計使用者數或會話數時,一定要先去重(DISTINCT),不然會誇大基數,導致結果錯誤;
  3. 提交率定義:不同公司對 “提交率” 的定義可能不一樣,面試時如果不確定,一定要先跟面試官確認業務邏輯,再動手寫 SQL;
  4. 時長單位:TIMESTAMPDIFF 可以選 SECOND(秒)、MINUTE(分鐘)、HOUR(小時),根據需求調整,面試時最好問清楚輸出單位。

ProgramHelp 2025 最新上岸學員實戰案例

這位學員是擁有 3 年經驗的 Data Analyst,技術基礎紮實但在面對 Big Tech(如 TikTok, Netflix)的 Online Assessment (OA) 時常因緊張導致發揮失常。

找到 ProgramHelp 後,我們為其提供了OA全流程無痕輔助。在本次 TikTok 面試中,學員在我們的專家助攻下,不僅完美解出所有 SQL 題目,還因程式碼邏輯清晰、零查重率(Plagiarism Free)獲得了面試官的高度評價,順利拿下 Offer!

author avatar
Jack Xu MLE | 微軟人工智慧技術人員
Princeton University博士,人在海外,曾在谷歌、蘋果等多家大廠工作。深度學習NLP方向擁有多篇SCI,機器學習方向擁有Github千星⭐️專案。
END