开足码力 开足码力
首页
  • 一定要看!!!
  • 0基础入门产品经理自学指南
  • 10年经验总结-产品新人入职修炼手册
  • 产品径路路线
  • 通用产品能力
  • C端产品经理
  • B端产品经理
  • 速通产品知识库
  • 产品地图
  • 产品思维培养
产品经理书单
  • 数据库基础
  • 面试宝典
  • 大厂内部材料
实战项目
校招信息汇
必备工具包
  • 简历模板下载
  • 在线简历制作
  • AI 简历诊断 VIP
  • 诊断记录查询
  • 服务介绍
  • 产品经理速成5天训练营
产品经理宝藏网站
首页
  • 一定要看!!!
  • 0基础入门产品经理自学指南
  • 10年经验总结-产品新人入职修炼手册
  • 产品径路路线
  • 通用产品能力
  • C端产品经理
  • B端产品经理
  • 速通产品知识库
  • 产品地图
  • 产品思维培养
产品经理书单
  • 数据库基础
  • 面试宝典
  • 大厂内部材料
实战项目
校招信息汇
必备工具包
  • 简历模板下载
  • 在线简历制作
  • AI 简历诊断 VIP
  • 诊断记录查询
  • 服务介绍
  • 产品经理速成5天训练营
产品经理宝藏网站
  • 数据库基础

  • 面试宝典

  • 大厂内部材料

    • 字节跳动SQL使用手册
      • 1. 前言:SQL 在字节跳动数据驱动中的核心地位
      • 2. SQL 基础与字节跳动最佳实践
        • 2.1 字节跳动常用 SQL 语法与规范
        • 2.2 性能优化:高效 SQL 编写技巧
        • 2.3 窗口函数在复杂分析中的应用
      • 3. SQL 在字节跳动核心业务场景的应用
        • 3.1 用户增长分析
        • 3.1.1 案例:用户留存率与活跃度分析
        • 3.1.2 案例:用户行为路径与漏斗分析
        • 3.2 广告效果评估
        • 3.2.1 案例:广告点击率(CTR)与转化率(CVR)计算
        • 3.2.2 案例:A/B 测试效果评估与 SQL 实现
        • 3.2.3 案例:广告评论情感分析与比例计算
        • 3.3 内容推荐优化
        • 3.3.1 案例:视频内容好评率计算
        • 3.3.2 案例:用户兴趣分析与内容匹配度评估
        • 3.4 直播业务数据分析
        • 3.4.1 案例:直播间实时在线人数与峰值分析
      • 4. 进阶:SQL 在字节跳动复杂数据分析中的应用
        • 4.1 连续行为分析(如连续登录、连续观看)
        • 4.2 图计算与 SQL 的结合(如 Graph-Reward-SQL 框架简介)
      • 5. 总结与展望:SQL 在字节跳动数据未来的角色
  • SQL专项
  • 大厂内部材料
开足码力
2026-02-06
目录

字节跳动SQL使用手册

# 字节跳动 SQL 使用手册

# 1. 前言:SQL 在字节跳动数据驱动中的核心地位

在字节跳动,数据是驱动一切业务决策和产品迭代的基石。作为公司内部最核心的数据分析工具之一,SQL (Structured Query Language) 扮演着至关重要的角色。无论是日常的业务监控、用户行为分析、广告效果评估,还是复杂的数据挖掘和模型训练,SQL 都是数据工程师和分析师们不可或缺的利器。

字节跳动拥有海量的用户数据和复杂的业务场景,例如抖音、今日头条等产品的用户增长分析,穿山甲等广告平台的投放效果优化,以及各类创新业务的探索,都离不开高效、准确的 SQL 查询与分析。因此,掌握扎实的 SQL 技能,并能够结合具体业务场景灵活运用,是每一位字节跳动数据从业者的基本素养。

本手册旨在总结字节跳动在 SQL 使用方面的最佳实践和常见业务场景下的应用案例,为内部员工提供一份实用、硬核的 SQL 指导。字节跳动内部拥有庞大的数据生态,涵盖了用户行为日志、广告投放数据、内容元数据、社交互动数据等多种类型,这些数据存储在分布式数据仓库(如 Apache Hive、Google BigQuery)和各类数据库(如 MySQL)中。SQL 作为与这些数据系统交互的标准语言,其重要性不言而喻。


# 2. SQL 基础与字节跳动最佳实践

# 2.1 字节跳动常用 SQL 语法与规范

在字节跳动,我们主要使用类 SQL 语言(如 Hive SQL、Spark SQL)进行大规模数据处理和分析。虽然不同的执行引擎可能在语法细节上略有差异,但核心的 SQL 标准是共通的。我们强调编写清晰、易读、高效的 SQL 代码。

命名规范:

  • 表名、字段名应使用有意义的英文单词或缩写,并采用下划线分隔,例如 user_behavior_log
  • 对于临时表或子查询,可以使用 tmp_ 作为前缀
  • 关键字(如 SELECT, FROM, WHERE, GROUP BY, ORDER BY)建议大写,列名和表名使用小写
  • 使用缩进和换行来组织复杂的查询逻辑

注释与优化:

  • 注释是良好编程习惯的体现,对于复杂的逻辑或关键步骤,应添加必要的注释说明
  • 充分利用**分区裁剪(Partition Pruning)和谓词下推(Predicate Pushdown)**等优化特性,避免全表扫描,提升查询效率
  • 在引用字段时,建议始终使用表别名或表名前缀,以避免歧义和提高可读性

# 2.2 性能优化:高效 SQL 编写技巧

在字节跳动这样数据量巨大的环境中,SQL 查询的性能优化至关重要。

核心原则:

  1. 理解数据分布和表结构是优化的前提。需要了解表的分区方式、索引情况、数据倾斜等信息
  2. 避免不必要的计算和数据移动。例如,在 JOIN 操作前,尽量通过 WHERE 条件过滤掉不需要的数据,减少参与 JOIN 的数据量
  3. 对于聚合操作,可以先对子查询进行聚合,再与其他表 JOIN,而不是先 JOIN 再聚合
  4. 合理使用 JOIN 类型。例如,当一个小表与大表 JOIN 时,可以考虑使用 MAPJOIN(Broadcast Join)将小表广播到所有节点,避免 Shuffle。对于大表与大表的 JOIN,需要注意是否存在数据倾斜问题,可以通过倾斜键处理(如加盐)或调整 JOIN 策略来解决
  5. 利用窗口函数替代自连接或子查询,窗口函数通常比自连接或复杂的子查询更高效,尤其是在进行组内排序、计算累计值等场景
  6. 注意数据类型的匹配,避免在 JOIN 或 WHERE 条件中进行隐式类型转换,这可能导致索引失效或计算错误
  7. 减少数据重复读取,对于需要多次使用的中间结果,可以将其写入临时表或使用 CTE(Common Table Expression)
  8. 关注执行计划,通过分析 SQL 的执行计划,可以了解查询的瓶颈所在,例如是否存在数据倾斜、是否有效利用了索引等

# 2.3 窗口函数在复杂分析中的应用

窗口函数是 SQL 中非常强大且常用的功能,尤其在字节跳动复杂的业务分析场景中,能够极大地简化查询逻辑并提升效率。窗口函数允许我们在不减少原表行数的情况下,对数据进行分组、排序并进行各种计算。

常见窗口函数:

  • 聚合窗口函数:SUM, AVG, COUNT, MAX, MIN
  • 排序窗口函数:ROW_NUMBER, RANK, DENSE_RANK
  • 偏移窗口函数:LAG, LEAD

典型应用场景:

  • 计算每个用户的首次购买时间、最近一次购买时间、购买次数等,可以使用 FIRST_VALUE, LAST_VALUE, COUNT 配合 OVER (PARTITION BY user_id ORDER BY order_time) 来实现
  • 在计算连续登录天数、连续观看视频等场景,LAG 和 LEAD 函数可以帮助我们获取前一行或后一行的数据,从而判断连续性
  • 解决 Top N 问题,例如找出每个品类下销售额最高的前 10 个商品,可以使用 ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY sales_amount DESC) 并筛选行号小于等于 10 的记录

在字节跳动,窗口函数被广泛应用于用户留存分析、活跃度分析、漏斗分析、RFM 模型构建等多个方面。


# 3. SQL 在字节跳动核心业务场景的应用

# 3.1 用户增长分析

# 3.1.1 案例:用户留存率与活跃度分析

用户留存率和活跃度是衡量产品健康度和用户粘性的核心指标。

留存率计算逻辑:

  • 通常指新用户在特定时间窗口后仍然活跃的比例,例如次日留存、7 日留存、30 日留存
  • 计算留存率首先需要确定新增用户集合和活跃用户集合
  • SQL 实现上,通常会先查询出每日的新增用户列表,然后与后续日期的活跃用户表进行关联
  • 例如,要计算 2023 年 10 月 1 日新增用户的 7 日留存率,我们会先筛选出 2023 年 10 月 1 日首次出现的用户 ID,然后左连接 2023 年 10 月 8 日的活跃用户 ID 列表(活跃定义为有任意行为记录),统计连接后非空的用户数除以新增用户总数
  • SQL 中会用到 DISTINCT 去重,LEFT JOIN,以及日期函数(如 DATE_ADD 或 INTERVAL)来计算后续日期

活跃度计算:

  • 关注用户在特定周期内的活跃情况,如日活跃用户数(DAU)、周活跃用户数(WAU)、月活跃用户数(MAU)
  • 计算 DAU 通常是对用户行为日志表按日期分组,并统计当天的独立用户数(COUNT(DISTINCT user_id))
  • 更细致的活跃度分析可能包括用户平均使用时长、平均启动次数等,这些都需要对用户行为日志进行聚合计算

# 3.1.2 案例:用户行为路径与漏斗分析

在字节跳动的用户增长分析中,理解用户行为路径并进行漏斗分析是至关重要的环节。

分析目标:

  • 通过 SQL 对用户行为数据进行挖掘,清晰地描绘用户从接触产品到完成特定目标(如注册、付费、持续活跃)的完整路径
  • 识别出路径中的关键转化节点和流失节点

具体案例:

  • 分析用户在一天内连续观看某一类别四个视频的行为
  • 假设存在一张用户行为表 user_video_behavior,包含字段 user_id, video_id, category, watch_time
  • 业务需求是提取出在一天内连续观看同一类别至少四个视频的用户 ID 和视频 ID

SQL 实现思路(使用窗口函数):

WITH ranked_logs AS (
    SELECT
        user_id,
        video_id,
        category,
        watch_timestamp,
        LAG(category, 1) OVER (PARTITION BY user_id ORDER BY watch_timestamp) AS prev_category,
        LAG(watch_timestamp, 1) OVER (PARTITION BY user_id ORDER BY watch_timestamp) AS prev_timestamp,
        ROW_NUMBER() OVER (PARTITION BY user_id, category ORDER BY watch_timestamp) AS seq_num
    FROM user_video_log
    WHERE DATE(watch_timestamp) = '特定日期' -- 假设 watch_timestamp 是日期时间类型
),
consecutive_groups AS (
    SELECT
        user_id,
        video_id,
        category,
        watch_timestamp,
        SUM(CASE WHEN category = prev_category AND 
                  TIMESTAMPDIFF(SECOND, prev_timestamp, watch_timestamp) <= 特定时间间隔 
             THEN 0 ELSE 1 END) 
            OVER (PARTITION BY user_id, category ORDER BY watch_timestamp) AS group_id
    FROM ranked_logs
),
consecutive_counts AS (
    SELECT
        user_id,
        video_id,
        category,
        group_id,
        COUNT(*) OVER (PARTITION BY user_id, category, group_id) AS consecutive_count
    FROM consecutive_groups
)
SELECT DISTINCT user_id, video_id
FROM consecutive_counts
WHERE consecutive_count >= 4;

关键步骤说明:

  1. 数据预处理与排序:筛选出指定日期范围内的数据,并按用户 ID 和观看时间进行排序
  2. 利用窗口函数标记连续行为:使用 ROW_NUMBER(), LAG(), LEAD() 来识别连续的观看行为
  3. 分组与筛选:根据标记,对用户和视频类别进行分组,并计算连续观看的视频数量
  4. 结果提取:最终提取出满足条件的用户 ID 和视频 ID

# 3.2 广告效果评估

# 3.2.1 案例:广告点击率(CTR)与转化率(CVR)计算

广告点击率(CTR)和转化率(CVR)是衡量广告效果最核心的两个指标。

CTR 计算:

  • 公式:CTR = (广告点击次数 / 广告曝光次数) * 100%
  • 通常会有一张广告曝光日志表和一张广告点击日志表
  • 计算 CTR 时,首先需要统计特定广告(或广告系列、渠道等维度)在一定时间范围内的总曝光次数和总点击次数
SELECT
    ad_id,
    COUNT(DISTINCT impression_id) AS impressions,
    COUNT(DISTINCT click_id) AS clicks,
    (COUNT(DISTINCT click_id) * 1.0 / COUNT(DISTINCT impression_id)) * 100 AS ctr
FROM ad_impression_log
LEFT JOIN ad_click_log USING (ad_id, impression_id) -- 假设 click_log 与 impression_log 通过 impression_id 关联
WHERE date BETWEEN '2023-10-01' AND '2023-10-07'
GROUP BY ad_id;

CVR 计算:

  • 公式:CVR = (转化次数 / 广告点击次数) * 100%
  • 转化可以是多种行为,如下载 App、注册、购买商品等
  • 计算 CVR 需要广告点击日志表和转化行为日志表,通过用户 ID 或点击 ID 关联转化行为表,统计转化次数

# 3.2.2 案例:A/B 测试效果评估与 SQL 实现

A/B 测试是字节跳动进行产品迭代和策略优化的重要手段,SQL 在 A/B 测试的效果评估中扮演着核心角色。

基本原理:

  • 将用户随机分配到不同的组(例如,对照组 A 和实验组 B),对照组使用现有版本或策略,实验组使用新版本或新策略
  • 通过比较两组在关键指标上的表现来判断新版本或新策略的效果

SQL 应用环节:

  1. 实验设计:明确实验的目标和假设,并选择合适的关键指标
  2. 样本分配:SQL 可以用于从用户表中随机抽样并分配到不同的实验组和对照组
  3. 数据收集:SQL 用于从行为日志表中提取用户在实验期间的行为数据,如曝光、点击、购买等
  4. 指标计算:构建 SQL 查询,统计每个实验分组中广告的曝光次数、点击次数和转化次数,然后计算相应的 CTR 和 CVR
  5. 统计检验:为了判断实验结果的显著性,通常需要进行假设检验(如 Z 检验或 T 检验)。SQL 可以用于计算检验统计量所需的中间数据,例如每个组的样本量、均值、方差等

字节跳动内部拥有强大的 A/B 测试平台 DataTester(对外产品名为火山引擎 A/B 测试,内部代号 Libra)。

# 3.2.3 案例:广告评论情感分析与比例计算

在字节跳动的广告业务中,评估广告效果不仅依赖于 CTR、CVR 等量化指标,用户对广告的评论内容和情感倾向也是衡量广告质量和用户接受度的重要维度。

分析场景:

  • 计算不同广告在信息流(feed)和动态(moments)中的评论比例
  • 假设有 ads 表(包含广告 ID 和广告名称)、feed_comments 表(记录信息流中的广告评论)和 moments_comments 表(记录动态中的广告评论)
WITH feed_comment_counts AS (
    SELECT ad_id, COUNT(comment_id) AS feed_comment_count
    FROM feed_comments
    GROUP BY ad_id
),
moments_comment_counts AS (
    SELECT ad_id, COUNT(comment_id) AS moments_comment_count
    FROM moments_comments
    GROUP BY ad_id
)
SELECT
    a.ad_id,
    a.ad_name,
    COALESCE(f.feed_comment_count, 0) AS feed_comments,
    COALESCE(m.moments_comment_count, 0) AS moments_comments,
    CASE 
        WHEN (COALESCE(f.feed_comment_count, 0) + COALESCE(m.moments_comment_count, 0)) = 0 THEN 0
        ELSE COALESCE(f.feed_comment_count, 0) / (COALESCE(f.feed_comment_count, 0) + COALESCE(m.moments_comment_count, 0))
    END AS feed_comment_ratio,
    CASE 
        WHEN (COALESCE(f.feed_comment_count, 0) + COALESCE(m.moments_comment_count, 0)) = 0 THEN 0
        ELSE COALESCE(m.moments_comment_count, 0) / (COALESCE(f.feed_comment_count, 0) + COALESCE(m.moments_comment_count, 0))
    END AS moments_comment_ratio
FROM ads a
LEFT JOIN feed_comment_counts f ON a.ad_id = f.ad_id
LEFT JOIN moments_comment_counts m ON a.ad_id = m.ad_id;

关键点:

  • 使用 CTE 分别计算每个广告在两个平台的评论数
  • 使用 COALESCE 函数处理可能存在的 NULL 值(即广告在某个平台没有评论的情况)
  • 使用 CASE WHEN 语句计算评论比例,并处理除数为零的情况

# 3.3 内容推荐优化

# 3.3.1 案例:视频内容好评率计算

在字节跳动的业务实践中,准确评估视频内容的质量和用户喜好对于优化推荐算法至关重要。

好评率计算方式:

  • 基础公式:好评率 = 好评数 / 视频观看次数
  • 平滑处理公式(贝叶斯平均):好评率 = (好评数 + 3) / (总评论数 + 7),旨在引入一个先验估计,使得在数据稀疏时,好评率不会过于偏向 0 或 1

SQL 实现:

  • 计算好评率通常需要关联用户行为表(如 content_action_info)和视频详情表(如 dim_content)
  • 用户行为表记录了用户对视频的各种互动,如点赞、差评、无评价等
SELECT
    COUNT(1) AS all_action,
    SUM(CASE WHEN a.content_action = '点赞' THEN 1 ELSE 0 END) AS like_action,
    SUM(CASE WHEN a.content_action = '点赞' THEN 1 ELSE 0 END) / COUNT(1) AS like_rate
FROM content_action_info AS a
JOIN dim_content AS b ON a.content_id = b.content_id
WHERE b.content_category = '科技'
  AND b.content_sub_category = '数码测评'
  AND a.create_time BETWEEN '2020-11-01' AND '2020-11-30';

指标计算细节:

  • 总行为数(视频观看次数):通过 COUNT(1) 计算符合条件的总行为数量
  • 好评数:通过 SUM(CASE WHEN a.content_action = '点赞' THEN 1 ELSE 0 END) 计算
  • 好评率:好评数除以总行为数

# 3.3.2 案例:用户兴趣分析与内容匹配度评估

在字节跳动的个性化推荐系统中,准确理解用户兴趣并将其与合适的内容进行匹配是核心目标。

SQL 应用场景:

  1. 用户行为数据聚合:
  • 内容偏好统计:通过分析用户的观看、点赞、评论、分享、收藏等行为,统计用户对不同类别、标签、主题、创作者的内容的偏好程度
SELECT
    user_id,
    content_category,
    SUM(watch_duration) AS total_watch_duration_category,
    COUNT(DISTINCT video_id) AS videos_watched,
    SUM(CASE WHEN action_type = 'like' THEN 1 ELSE 0 END) AS like_count,
    AVG(CASE WHEN action_type = 'like' THEN 1 ELSE 0 END) AS like_rate
FROM user_content_interaction_log
GROUP BY user_id, content_category;
  1. 行为序列分析:利用窗口函数分析用户的行为序列,例如用户连续观看同一主题视频的频率、观看不同类型视频的切换模式等,以捕捉用户兴趣的动态变化
  2. 内容特征提取:从内容元数据表中提取内容的特征,如类别、标签、关键词、时长、创作者等
  3. 兴趣画像构建与匹配度评估:基于用户行为聚合结果和内容特征,构建用户兴趣画像(例如,用户对不同标签的偏好权重)。通过 SQL 计算用户兴趣向量与内容特征向量之间的相似度(如余弦相似度),作为内容匹配度的初步评估
  4. A/B 测试与效果评估:将基于新兴趣模型或匹配策略的推荐结果通过 A/B 测试进行验证。SQL 用于计算不同实验组的推荐效果指标,如点击率、观看时长、多样性等

# 3.4 直播业务数据分析

# 3.4.1 案例:直播间实时在线人数与峰值分析

在字节跳动的直播业务中,实时监控和分析直播间在线人数及其峰值对于运营决策和资源调度至关重要。

分析目标:

  1. 统计每个直播间在特定时间段内的平均在线人数、最高在线人数(峰值)以及峰值出现的时间
  2. 分析不同主播、不同直播分类的在线人数表现
  3. 识别高人气直播间和潜力主播

数据表结构假设: 假设存在一张直播观看记录表 live_watch_log,包含以下字段:

  • live_id (直播 ID)
  • user_id (观看用户 ID)
  • watch_start_time (用户进入直播间时间)
  • watch_end_time (用户离开直播间时间)
  • anchor_id (主播 ID)
  • live_category (直播分类)

SQL 实现思路:

-- 示例:计算每个直播间的平均在线人数、最高在线人数及峰值时间
WITH TimeSeries AS (
    -- 假设已知直播开始和结束时间,生成分钟级时间序列
    SELECT explode(sequence(to_unix_timestamp('直播开始时间'), 
                           to_unix_timestamp('直播结束时间'), 60)) AS minute_ts
    FROM (SELECT 1) AS dummy
),
MinuteOnlineUsers AS (
    SELECT
        l.live_id,
        from_unixtime(t.minute_ts) AS live_minute,
        COUNT(DISTINCT w.user_id) AS online_users_count
    FROM TimeSeries t
    JOIN live_watch_log w ON from_unixtime(t.minute_ts) BETWEEN w.watch_start_time 
        AND COALESCE(w.watch_end_time, from_unixtime(t.minute_ts))
    -- 假设 live_info 表包含直播信息
    JOIN live_info l ON w.live_id = l.live_id
    WHERE l.live_start_time <= from_unixtime(t.minute_ts) 
      AND l.live_end_time >= from_unixtime(t.minute_ts)
    GROUP BY l.live_id, t.minute_ts
),
LiveStats AS (
    SELECT
        live_id,
        AVG(online_users_count) AS avg_online_users,
        MAX(online_users_count) AS max_online_users
    FROM MinuteOnlineUsers
    GROUP BY live_id
),
PeakTime AS (
    SELECT
        live_id,
        live_minute AS peak_time,
        online_users_count,
        ROW_NUMBER() OVER (PARTITION BY live_id ORDER BY online_users_count DESC, live_minute ASC) AS rank
    FROM MinuteOnlineUsers
)
SELECT
    s.live_id,
    s.avg_online_users,
    s.max_online_users,
    p.peak_time
FROM LiveStats s
JOIN PeakTime p ON s.live_id = p.live_id AND p.rank = 1;

关键逻辑:

  1. 生成时间序列:首先,需要生成一个连续的时间序列,覆盖直播的整个周期(例如,每分钟一个点)
  2. 计算每分钟在线人数:将时间序列与观看记录表进行关联,统计在每个时间点有多少用户正在观看直播。这通常涉及到判断 watch_start_time <= 当前分钟 AND (watch_end_time >= 当前分钟 OR watch_end_time IS NULL)
  3. 聚合统计:对每个直播间,按直播 ID 和时间粒度(如每分钟)进行聚合,计算在线人数。然后,再对每个直播 ID 进行聚合,计算平均在线人数、最高在线人数。峰值出现的时间可以通过窗口函数或子查询获取

# 4. 进阶:SQL 在字节跳动复杂数据分析中的应用

# 4.1 连续行为分析(如连续登录、连续观看)

连续行为分析是字节跳动数据驱动决策中的一个重要组成部分,广泛应用于用户增长、内容推荐、风险控制等多个业务场景。

核心思路: 解决这类问题的核心思路是利用 SQL 的窗口函数(Window Functions)。窗口函数允许对查询结果集中的一组行执行计算,这组行与当前行有某种关系。

常见解法(以"找出连续 7 天登录的用户"为例):

  1. 首先,对每个用户的登录日期进行去重和排序
  2. 然后,使用 ROW_NUMBER() 函数为每个用户的登录日期按升序编号
  3. 接着,将登录日期减去对应的行号。如果用户是连续登录的,那么 登录日期 - 行号 会得到一个固定的日期值
  4. 最后,对这个固定的日期值进行分组计数,筛选出计数大于等于 7 的用户即可
-- 示例:找出连续登录 7 天及以上的用户
WITH user_login_ranks AS (
    SELECT
        user_id,
        login_date,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rank
    FROM (
        SELECT DISTINCT user_id, login_date FROM user_login_table
    ) AS distinct_logins
),
consecutive_groups AS (
    SELECT
        user_id,
        login_date,
        DATE_SUB(login_date, INTERVAL rank DAY) AS group_start_date
    FROM user_login_ranks
),
consecutive_counts AS (
    SELECT
        user_id,
        group_start_date,
        COUNT(*) AS consecutive_days
    FROM consecutive_groups
    GROUP BY user_id, group_start_date
)
SELECT DISTINCT user_id
FROM consecutive_counts
WHERE consecutive_days >= 7;

扩展应用: 类似地,对于"提取一天内连续观看某一类别 4 个视频的用户"这个问题,也可以采用窗口函数的思路。首先按用户和观看时间排序,然后通过 LAG() 函数比较当前观看视频的类别和前一个视频的类别,以及观看时间差,来判断是否属于连续观看同一类别。

这类分析不仅限于登录和观看行为,还可以扩展到购买行为、分享行为、评论行为等多种用户行为序列的分析。

# 4.2 图计算与 SQL 的结合(如 Graph-Reward-SQL 框架简介)

在字节跳动,随着业务复杂度的提升和数据量的激增,传统 SQL 在处理某些特定场景时可能会遇到性能瓶颈或表达能力不足的问题。为了应对这些挑战,字节跳动积极探索 SQL 与其他计算范式的结合,其中图计算与 SQL 的结合是一个重要的方向。

Graph-Reward-SQL 框架: 一个典型的例子是字节跳动内部提出的 Graph-Reward-SQL 框架。该框架虽然主要目标是提升 Text-to-SQL 模型的训练效率,但其设计理念和技术实现中蕴含了对 SQL 深层理解和扩展的思路。

核心创新点:

  1. 图匹配网络评分(GMNScore):通过图匹配网络直接评估 SQL 语句的功能等价性,无需实际执行查询即可捕捉深层语义。例如,对于 WHERE age > 34 和 WHERE age >= 35 这样的查询,虽然语法不同,但在特定数据分布下可能语义相近,GMNScore 能够更好地识别这类语义相似性
  2. 渐进式关系运算符树匹配(StepRTM):专注于评估公共表表达式(CTE)中子查询的生成过程,通过渐进式奖励机制,引导模型生成结构更优、可读性更强的复杂 SQL 查询

实践意义:

  • CTE 作为一种将子查询定义为临时命名结果集的技术,能够显著提升复杂查询的可读性和模块化程度,允许在后续查询中多次引用,这对于编写和维护大型分析脚本至关重要
  • 该框架的提出,反映了字节跳动在 SQL 应用上的两个趋势:一是追求更高效、更智能的 SQL 生成与优化;二是关注 SQL 本身的可读性、可维护性和语义准确性

# 5. 总结与展望:SQL 在字节跳动数据未来的角色

SQL 作为字节跳动数据驱动文化的核心支柱,其地位在未来不仅不会削弱,反而会更加重要和深化。随着公司业务的持续扩张和数据量的指数级增长,对数据分析和洞察的需求将愈发迫切和精细化。

SQL 作为连接数据与业务、实现数据价值的关键工具,将持续在以下几个方面发挥不可替代的作用:

  1. 数据 democratization(数据民主化)的基石:SQL 的易学易用性使其成为赋能更广泛业务人员(而不仅仅是专业数据工程师)进行数据探索和自助分析的首选工具

  2. 复杂分析与深度洞察的引擎:尽管新兴技术如 AI/ML 发展迅速,但 SQL 在处理大规模结构化数据、进行复杂关联分析、构建核心业务指标等方面依然具有独特优势。窗口函数、CTE 等高级 SQL 特性将被更广泛地应用于解决用户行为分析、广告归因、内容推荐等领域的复杂问题

  3. 数据仓库与数据湖的核心交互语言:无论是传统的数仓架构还是新兴的 Lakehouse 架构,SQL 都是进行数据 ETL、数据建模、数据查询和分析的标准语言。字节跳动将持续优化其大数据平台(如基于 Spark/Flink 的 SQL 引擎)的性能和功能

  4. 与 AI/ML 的深度融合:SQL 将与机器学习框架更紧密地结合。例如,通过 SQL 直接调用机器学习模型进行预测分析,或者将 SQL 查询的结果无缝对接到模型训练流程中。Graph-Reward-SQL 这类探索也预示着 SQL 本身将变得更加"智能",能够自动优化或生成更高效的查询

  5. 实时数据处理与分析的关键:随着业务对实时性要求的提高,流处理 SQL(如 Flink SQL)将在实时监控、实时推荐、实时风控等场景扮演更核心的角色。字节跳动将持续推动流批一体技术的发展,使得 SQL 能够统一处理历史和实时数据

展望未来,SQL 在字节跳动的角色将从单纯的数据查询工具,向更智能、更高效、更易用的数据分析和价值创造平台演进。数据工程师和分析师需要不断深化 SQL 技能,掌握最新的 SQL 特性和最佳实践,同时积极拥抱 SQL 与其他技术的融合,以更好地应对未来的数据挑战,驱动业务持续创新和增长。

短视频平台常见SQL面试题

← 短视频平台常见SQL面试题

Theme by Vdoing | Copyright © 2025-2026 开足码力 | MIT License | 陕ICP备2025065468号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式