标准答案

  1. ROW_NUMBER、RANK、DENSE_RANK 适合按分组排名,并可用于取每组最新一条或前 N 条记录。
  2. SUM、AVG 等配合 OVER 和窗口边界可计算累计值、移动平均和时间序列指标。
  3. LAG、LEAD 可以读取同一分区的前后记录,适合比较状态变化、相邻事件和环比。
  4. PARTITION BY 定义独立计算组,ORDER BY 定义组内顺序;排序字段必须稳定,否则排名与分页可能不确定。
  5. 窗口函数通常需要排序或分区扫描,大数据场景要先过滤并评估索引、内存与离线预聚合。

题目解析

传统 GROUP BY 会把多行压成一行,窗口函数则把聚合结果附在每行旁边。这个差异使它特别适合“既要明细又要知道自己在组内排名”的需求,例如每个用户最新一次登录或每个类目销量前十商品。

窗口函数是查询表达能力,不是性能魔法。一个没有时间范围的全量分区排名,在大表上仍要承担排序和扫描成本;线上接口应限制分区规模和返回范围。

常见误区

  • 使用 RANK 后却假设排名连续,忽略并列时会跳号。
  • 没有稳定的次级排序字段,两个相同时间的记录每次可能返回不同的“第一条”。

作者信息