sql面试需掌握业务场景深度:漏斗分析重行为时序与去重,留存率重日期处理与新用户定义,订单分析重状态时效与时区,指标对齐重样本验证与null处理。

SQL面试中,光会写基础查询远远不够。真实业务场景下的SQL题,往往涉及多表关联、时间窗口分析、去重逻辑、指标计算偏差处理等细节,稍不注意就会掉进坑里。
一、用户行为漏斗分析(常见于电商/内容平台)
题目常给一张用户行为日志表(user_id, event_type, page, timestamp),要求计算从“首页曝光”→“商品点击”→“加入购物车”→“下单”的转化率。
关键点不是写JOIN,而是理解业务逻辑:
- 行为顺序不能错:必须是同一用户在合理时间窗口内(比如24小时内)的有序行为,不能简单按event_type分组count;
- 去重要谨慎:一个用户一天多次“下单”,只算1次转化,但“首页曝光”可能有几十次,需用MIN(timestamp)或ROW_NUMBER()锚定首次路径;
- 漏斗断层要归因:如果“加入购物车”人数远低于“商品点击”,可能是加购按钮埋点漏报,SQL里得先验证event_type值是否完整(SELECT DISTINCT event_type)。
二、留存率计算(DAU类指标高频考点)
给定login_log表(user_id, login_date),求次日留存率、7日留存率。
很多候选人直接用LAG或自连接,但线上数据常有陷阱:
eSiteGroup站群管理系统是基于eFramework低代码开发平台构建,是一款高度灵活、可扩展的智能化站群管理解决方案,全面支持SQL Server、SQLite、MySQL、Oracle等主流数据库,适配企业级高并发、轻量级本地化、云端分布式等多种部署场景。通过可视化建模与模块化设计,系统可实现多站点的快速搭建、跨平台协同管理及数据智能分析,满足政府、企业、教育机构等组织对多站点统一管控的
- 日期字段类型要确认:login_date是DATE还是DATETIME?如果是后者,需先CAST或DATE()截取;
- “新用户”定义必须明确:是首次登录当天为基准日,还是注册日?面试官没说清时,要主动问——真实业务中这个口径直接影响结果;
- 避免笛卡尔积式自连接:用LEFT JOIN + 条件 ON t1.user_id = t2.user_id AND DATEDIFF(t2.login_date, t1.login_date) = 1 更稳,再配合COUNT(DISTINCT t1.user_id)做分母。
三、订单状态变更分析(金融/交易系统典型题)
订单表orders(order_id, status, update_time),status含'created'/'paid'/'shipped'/'cancelled',要求查出所有“已支付但未发货且超2小时”的订单。
这题考的是对状态时效性的敏感度:
- 不能只看最新一条记录:一个订单可能反复改状态(如paid→cancelled→paid),要用窗口函数取每个order_id按update_time排序的最新status;
- 时间比较要带时区意识:update_time是UTC还是本地时间?面试中若没提,默认按题干时区处理,但可备注“生产环境需统一时区”;
- NULL值要兜底:shipped时间可能为空,WHERE shipped_time IS NULL比!= 'shipped'更安全,因为status字段可能存其他值(如'refunding')。
四、指标口径对齐与调试思维
当SQL结果和BI报表数字对不上,怎么办?
- 先查样本:随机取5个user_id,人工核对原始日志中的行为链路;
- 拆解中间表:把漏斗每一步单独查出来(如只查“首页曝光且有后续点击”的用户数),定位哪一环掉量异常;
- 检查NULL和空字符串:GROUP BY字段是否含NULL?COUNT(*)和COUNT(col)差异是否被忽略?这些在真实数据中极常见。
业务SQL不是炫技,核心是用数据还原真实场景。写完别急着交,多问自己一句:“这个结果,运营同学拿到能直接用吗?”









