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

1,329次閱讀

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千星⭐️项目。
正文完