SQL 窗口函数会吗?举几个使用场景。
五个经典回答示范
窗口函数语法是 函数 over (partition by … order by …)。常用四类:排序类 row_number、rank、dense_rank;偏移类 lag、lead;聚合类 sum、avg 累计;取值类 first_value。和 group by 的区别:group by 聚合后每组一行,窗口函数保留每行明细、按窗口计算。
我讲三个高频场景:每组 TopN——按分组排 row_number 取 1,比如每个城市销量前三的门店;环比同比——lag 取上一期算增长率;累计指标——order by 日期 sum 累计销售额。面试让我手写:每个部门工资前二的人,我用 row_number partition by 部门 order by 工资 desc 取小于等于 2,同时说明去重要用 dense_rank。
我会讲窗口函数的执行逻辑与性能:它在 group by 之后、order by 之前执行,需要先分区排序,大表上代价高;优化手段——过滤条件下推减少参与窗口计算的数据量、利用索引满足 partition 与 order、避免不必要的全表窗口。数据倾斜时单个分区巨大,考虑分桶预处理。会用更要懂成本,这是和其他候选人的差异点。
追问『row_number、rank、dense_rank 区别』:并列时 1-2-2-4 / 1-2-2-3 / 1-2-3-4,按业务语义选;『累计去重怎么写』:sum(distinct 用户) over 不行,要子查询每日去重再累计;『lag 默认值』:第三参数指定,没有则是 NULL,计算留存时空值处理要小心。
『窗口函数就是高级一点的 group by,我用熟了 group by 加子查询嵌套几层什么都能实现,没必要学新语法。』——点评:多层嵌套子查询可读性和性能都差,TopN 场景老写法在部分数据库直接不支持;拒绝新工具不是熟练而是停滞。
- 打开 模拟练习,选择「数据分析」方向,限时 3 分钟作答本题。
- 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
- 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。
这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。