窗口函数与 CTE 与递归

共 58 题
#

1. EXCLUDE 子句(EXCLUDE CURRENT ROW、EXCLUDE TIES、EXCLUDE GROUP、EXCLUDE NO OTHERS)的语义?

A EXCLUDE GROUP 只排除当前行
B EXCLUDE TIES 排除当前行
C EXCLUDE NO OTHERS 排除所有行
D EXCLUDE CURRENT ROW 排除当前行,EXCLUDE TIES 排除同值平局行但保留当前行 ✓ 正确答案
#

2. ROWS BETWEEN 与 RANGE BETWEEN 的语义差异,行号 vs 值范围?例如 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。

A ROWS 按物理行号,RANGE 按值范围且当前行包含所有同值 peer 行 ✓ 正确答案
B ROWS 按值范围,RANGE 按行号
C 两者等价
D RANGE 不需要 ORDER BY
#

3. 排名函数 ROW_NUMBER、RANK、DENSE_RANK、NTILE 的差异,相同排序键值时各自的行为?

A ROW_NUMBER 平局时给相同编号
B RANK 相同值给相同排名但有间隔,DENSE_RANK 无间隔,NTILE 分桶 ✓ 正确答案
C DENSE_RANK 有间隔
D NTILE 给唯一编号
#

4. 窗口函数与 GROUPING 的协同,先分组再窗口再过滤的执行顺序?

A 先 WHERE→GROUP BY→聚合,再计算窗口函数,窗口结果需子查询才能过滤 ✓ 正确答案
B 窗口函数先于 GROUP BY 计算
C 窗口函数与聚合同时
D HAVING 可以引用窗口结果
#

5. 窗口函数中的 ORDER BY 与语句级 ORDER BY 的执行顺序?

A 两者必须相同
B 窗口 ORDER BY 在窗口计算阶段使用,语句级 ORDER BY 在窗口之后执行定义最终顺序,两者独立 ✓ 正确答案
C 语句级 ORDER BY 先执行
D 窗口函数不需要 ORDER BY
#

6. 窗口函数的分区裁剪(Partition Pruning),PARTITION BY 对大表性能的影响?

A PARTITION BY 把数据分区独立计算,可减少每分区排序范围,结合分区裁剪提高性能 ✓ 正确答案
B PARTITION BY 会增大排序范围
C PARTITION BY 不影响性能
D 分区数越多一定越快
#

7. 窗口函数的执行阶段,WHERE → GROUP BY → 聚合 → 窗口 → DISTINCT → ORDER BY → LIMIT,窗口在 SELECT 列表的何时计算?

A 窗口函数在 WHERE 之前计算
B 窗口函数在聚合之后、DISTINCT 与 ORDER BY 之前计算,处于 SELECT 阶段 ✓ 正确答案
C 窗口函数在 LIMIT 之后计算
D 窗口函数与聚合同时
#

8. 窗口函数能否在 WHERE 子句中使用?为什么?

A 可以直接使用
B 只能在 HAVING 中使用
C 只有聚合窗口函数可以
D 不能直接使用,因 WHERE 在窗口函数之前执行;需先子查询算窗口再过滤 ✓ 正确答案
#

9. 窗口函数(Window Function)的语法结构,函数 OVER ([PARTITION BY ...] [ORDER BY ...] [frame_clause]) 中每个子句的语义?

A PARTITION BY 分区、ORDER BY 排序、frame_clause 定义帧边界,共同决定窗口计算范围 ✓ 正确答案
B PARTITION BY 定义排序,ORDER BY 定义分区
C frame_clause 是必选的
D 无 PARTITION BY 时报错
#

10. 聚合函数作为窗口函数(SUM、AVG、COUNT OVER)的累计计算语义?

A 累计和总是整个分区总值
B 聚合函数不能作窗口函数
C 它不能配 ORDER BY
D 聚合窗口函数按帧做累计计算,如 SUM OVER (ORDER BY id) 是累计和 ✓ 正确答案
#

11. 分布式引擎(Spark SQL/Trino)如何并行化窗口函数(按 PARTITION BY 键 shuffle 数据、分区内排序后计算)?缺少 PARTITION BY 为何会造成单节点瓶颈?

A 分区数越多一定越快
B 无 PARTITION BY 也能并行
C 窗口函数不需要 shuffle
D 按 PARTITION BY 键 shuffle 分区、分区内排序计算,缺少 PARTITION BY 会造成单节点瓶颈 ✓ 正确答案
#

12. SQL:2016 的 GROUPS 帧模式与 ROWS/RANGE 的语义差异(GROUPS 按排序值相同的 peer 组数计边界)是什么?移动平均去抖为何常用 GROUPS + EXCLUDE GROUPS?

A GROUPS 按 peer 组数计边界,整组纳入,配合 EXCLUDE GROUPS 可做稳定的去抖移动平均 ✓ 正确答案
B GROUPS 按行号计边界
C GROUPS 与 ROWS 等价
D GROUPS 不能与 EXCLUDE 配合
#

13. SELECT 列表与 ORDER BY 中能否使用窗口函数?

A 只能用于 SELECT 列表
B 可用于 SELECT 列表和 ORDER BY,但不能用于 WHERE/GROUP BY/HAVING ✓ 正确答案
C 不能用于 ORDER BY
D 可用于 WHERE
#

14. 为什么说窗口函数是 OLAP 利器但 OLTP 不适用?

A 窗口函数适合 OLTP 高频单行场景
B 窗口函数是 OLAP 利器,但因需扫描排序大范围数据、延迟高,不适合 OLTP 高频单行场景 ✓ 正确答案
C 两者都适用
D 窗口函数只用于 OLTP
#

15. 窗口函数中 NULL 的处理,NULLS FIRST、NULLS LAST 子句?

A NULL 总是排最前
B NULL 不能参与窗口排序
C 可用 NULLS FIRST/LAST 显式控制 NULL 排序位置,默认行为因数据库与升降序而异 ✓ 正确答案
D NULLS LAST 只用于降序
#

16. 窗口函数的分区排序与帧计算如何消耗 work_mem 并可能落盘(Sort/WindowAgg 节点)?多个窗口共用同一 WINDOW 定义为何能减少排序次数?

A 排序超 work_mem 会落盘,多个窗口共用同一 WINDOW 定义可共享一次排序减少开销 ✓ 正确答案
B 排序永不落盘
C 窗口函数不需要排序
D 复用 WINDOW 定义会增加排序
#

17. PARTITION BY 与 GROUP BY 的本质区别?

A 两者等价
B 两者都不保留行
C GROUP BY 合并多行为一行,PARTITION BY 保留每行只分区计算窗口函数 ✓ 正确答案
D PARTITION BY 合并行
#

18. SELECT row_number() OVER (ORDER BY id) FROM t 的语义?

A 按 id 分组
B 按 id 对全表排序并给每行唯一连续编号 ✓ 正确答案
C 返回 NULL
D 只返回最大值
#

19. SUM(col) OVER (ORDER BY id) 与 SUM(col) OVER (PARTITION BY id ORDER BY id) 区别?

A 两者等价
B 前者是分区累计
C 前者是全表全局累计和,后者按 id 分区累计(分区键为 id 时每分区一行) ✓ 正确答案
D 两者都无累计
#

20. 窗口函数中 ORDER BY 是否必需?

A 必须提供
B 只有聚合函数需要
C 可选:排名函数需 ORDER BY,聚合窗口函数无 ORDER BY 时整个分区为帧返回分区总值 ✓ 正确答案
D 提供会报错
#

21. 窗口函数在 OLAP 中的典型应用(TopN、累计、移动平均)?

A 分组 TopN、累计和、移动平均、环比(LAG/LEAD)都是窗口函数的典型应用 ✓ 正确答案
B 只能用于排序
C 窗口函数不能做累计
D 移动平均必须用 GROUP BY
#

22. 窗口函数能否与 GROUP BY 同时使用?

A 不能同时使用
B 窗口函数先于 GROUP BY
C 可以先 GROUP BY 聚合再对聚合结果应用窗口函数,如按 COUNT(*) 排名 ✓ 正确答案
D 组合后必须用 DISTINCT
#

23. 窗口函数能否在 UPDATE SET 子句中使用?

A 可以直接使用
B 会报错无法实现
C 只能用于 SELECT
D 不能直接在 SET 中用,但可先子查询算窗口再通过 UPDATE ... FROM 关联更新 ✓ 正确答案
#

24. 窗口函数能否用作 CTE 的输出?

A 不允许
B 可以在 CTE 内计算窗口函数,外层再过滤,是"先算窗口再过滤"的经典模式 ✓ 正确答案
C CTE 不能包含窗口函数
D 窗口函数必须放在外层
#

25. CTE 物化(Materialized)与不物化(Inline)的执行计划差异,AS MATERIALIZED 关键字何时使用?

A CTE 总是物化
B 物化会重复计算
C 内联总是更优
D PostgreSQL 12+ 默认可内联,AS MATERIALIZED 强制物化,适合多次引用或昂贵计算场景 ✓ 正确答案
#

26. 窗口函数与 LATERAL 子查询实现每组 TopN 的写法与性能对比

A 两者等价且性能相同
B LATERAL 不能实现 TopN
C 窗口函数一次排序简洁;LATERAL 逐组取 LIMIT,有索引时可能更快,数据量大无索引时代价高 ✓ 正确答案
D 窗口函数不能分组 TopN
#

27. CTE(Common Table Expressions)的基本语法,WITH cte AS (SELECT ...) SELECT ... 与子查询的取舍?

A CTE 提升可读性、支持复用与递归,逻辑复杂或复用场景优于子查询 ✓ 正确答案
B CTE 只能用一次
C 子查询无法命名
D CTE 性能总差于子查询
#

28. CYCLE 子句(SQL 标准、PostgreSQL 14+)的防环机制,CYCLE col SET is_cycle USING path?

A CYCLE 子句用于排序
B CYCLE 只用于非递归 CTE
C CYCLE 子句无法检测环
D CYCLE col SET is_cycle USING path 自动检测环,标记 is_cycle 并记录 path,避免无限递归 ✓ 正确答案
#

29. PostgreSQL 中默认 CTE 是否被优化器内联?12 版本之前默认物化的语义变化?

A 12 之前默认内联
B 从未变化
C 12+ 总是物化
D 12 之前默认物化优化受限,12+ 默认可内联获得下推等优化,并支持 AS MATERIALIZED 显式控制 ✓ 正确答案
#

30. SEARCH 子句(深度优先 vs 广度优先)的递归顺序控制?

A SEARCH 用于防环
B SEARCH DEPTH FIRST / BREADTH FIRST BY 控制递归遍历顺序,SET 列记录顺序 ✓ 正确答案
C SEARCH 只能做深度优先
D 无 SEARCH 时顺序确定
#

31. 多个 CTE 的链式使用,WITH cte1 AS ..., cte2 AS ... 的依赖与并行性?

A 后定义 CTE 不能引用前面的
B 多 CTE 一定并行
C 后续 CTE 可引用前面定义的 CTE,需按依赖顺序定义,并行性由优化器决定 ✓ 正确答案
D 多 CTE 只能串联不能复用
#

32. 数据修改 CTE(WITH ... AS (DELETE ... RETURNING))的原子性与可见性?

A 数据修改 CTE 不能使用 RETURNING
B 整个语句原子执行,主查询可引用 RETURNING 返回的行,修改间可见性受 MVCC 限制 ✓ 正确答案
C 数据修改 CTE 非原子
D 主查询看不到 RETURNING 结果
#

33. 递归 CTE 实现树遍历、组织层级、图遍历的典型 SQL 模式?

A 递归 CTE 只需一个成员
B 递归 CTE 无法遍历层级
C 锚成员取初始行、递归成员按连接展开下一层,用 UNION ALL 组合,可做树/层级/图遍历 ✓ 正确答案
D 递归 CTE 必须用 UNION
#

34. 递归 CTE 的终止条件如何保证?无穷递归如何防护?MAX_RECURSIONS 设置?

A 递归 CTE 不会无限递归
B 防环不需要 CYCLE
C 只能靠 MAXRECURSION
D 靠递归成员不再产生新行终止,可用路径/深度限制/CYCLE 子句防环,SQL Server 有 MAXRECURSION 上限 ✓ 正确答案
#

35. 递归 CTE 的语法结构,锚成员(anchor member)、递归成员(recursive member)、UNION/UNION ALL 的语义差异?

A 锚成员返回初始层,递归成员引用自身逐层扩展,用 UNION 或 UNION ALL 连接(ALL 不去重更高效) ✓ 正确答案
B 锚成员是递归引用自身的查询
C 递归成员不能引用自身
D 必须用 UNION 去重
#

36. CTE 在 INSERT/UPDATE/DELETE 中的 RETURNING 应用?

A RETURNING 只能用于 SELECT
B RETURNING 不能配合 CTE
C INSERT/UPDATE/DELETE 可用 RETURNING 返回受影响行,配合 CTE 实现链式操作 ✓ 正确答案
D DELETE 不支持 RETURNING
#

37. 递归 CTE 的性能,迭代次数、深度限制、内存消耗?

A 性能取决于迭代次数与每层数据量,深度过大时中间结果多、内存消耗大,需限制深度或用索引 ✓ 正确答案
B 递归 CTE 不耗内存
C 深度无限制
D 递归 CTE 总是很快
#

38. CTE 中能否包含 UNION、INTERSECT?

A CTE 不能包含 UNION
B 普通 CTE 可包含 UNION/INTERSECT,递归 CTE 的锚与递归连接必须用 UNION/UNION ALL ✓ 正确答案
C 递归 CTE 可用 INTERSECT
D 只有递归 CTE 能用 UNION
#

39. CTE 的 AS MATERIALIZED 何时更优?

A 总是应该物化
B 物化总是更慢
C 当 CTE 被多次引用、计算昂贵或含 volatile 副作用时物化更优,单次引用可内联时不宜 ✓ 正确答案
D 内联导致重复计算
#

40. CTE 能否引用前面的 CTE?链式 CTE 的限制?

A 后定义的 CTE 可被前面引用
B 链式 CTE 不能组合
C 可以循环引用
D CTE 只能引用前面定义的 CTE,依赖必须无环,递归 CTE 只允许自引用 ✓ 正确答案
#

41. PostgreSQL 中 CTE 默认被优化器如何处理?

A 总是物化
B 总是内联
C 12+ 默认可内联,但多次引用、递归、volatile 副作用等场景强制物化 ✓ 正确答案
D 从不内联
#

42. 数据修改 CTE 的可见性,在 SELECT 中引用 DELETE 结果?

A 主查询看不到 DELETE 结果
B 主查询直接看到所有表修改
C 数据修改 CTE 不能返回行
D 主查询可通过 RETURNING 引用 DELETE/UPDATE 返回的行,但不能直接看到对表的修改 ✓ 正确答案
#

43. 递归 CTE 终止的两种典型模式,自引用闭环 vs MAX RECURSION。

A 只有 MAXRECURSION
B 自引用闭环靠路径检测/无环自然终止,MAXRECURSION 是强制深度上限的安全兜底 ✓ 正确答案
C 闭环无法终止
D 两者互斥
#

44. GAPS 与 NO GAPS 选项在窗口帧中的含义?

A GAPS 让帧边界按值区间(含不存在的值),NO GAPS 只按实际存在的值,影响 RANGE 帧包含的行 ✓ 正确答案
B 两者等价
C 只能用于 ROWS 帧
D 与帧无关
#

45. LAG、LEAD、FIRST_VALUE、LAST_VALUE、NTH_VALUE 的偏移访问语义与边界处理?

A LAG 返回后 n 行值
B LEAD 返回前 n 行
C LAG(col,n,default) 返回前 n 行、越界返回 default;FIRST/LAST/NTH_VALUE 在帧内取值且依赖帧边界 ✓ 正确答案
D 这些函数不能配 default
#

46. 移动平均(Moving Average)与累计和(Cumulative Sum)的窗口帧设置?

A 两者都用 UNBOUNDED PRECEDING
B 移动平均用 n PRECEDING 有限窗口,累计和用 UNBOUNDED PRECEDING ✓ 正确答案
C 移动平均用 UNBOUNDED PRECEDING
D 帧对两者无影响
#

47. 窗口定义(Window Definition)的命名与复用,WINDOW w AS (...) 的语法?

A 窗口定义不能命名
B WINDOW 子句必须在 ORDER BY 之后
C 命名窗口只能用一个函数
D WINDOW w AS (...) 命名窗口定义,多个函数复用,减少重复书写与排序 ✓ 正确答案
#

48. FIRST_VALUE 与 LAST_VALUE 在 ORDER BY 不同时的差异?

A 两者默认都返回分区最后一行
B 两者等价
C FIRST_VALUE 默认返回分区第一行,LAST_VALUE 默认只到当前行,需 UNBOUNDED FOLLOWING 才取分区最后一行 ✓ 正确答案
D 帧不影响它们
#

49. LAG(col, 1, 0) 的三个参数含义?

A 返回当前行前一行 col 值,越界(第一行)返回默认值 0 ✓ 正确答案
B 返回后一行 col 值
C 三个参数分别表示列、默认值、偏移
D 越界一定返回 NULL
#

50. CTE 与视图(VIEW)在代码复用与性能上的取舍

A 两者完全等价
B CTE 是单语句内临时复用,视图是持久化对象可跨查询复用,物化视图可提升性能 ✓ 正确答案
C 视图是临时的
D CTE 可持久化
#

51. PERCENT_RANK 与 CUME_DIST 的差异?

A 两者等价
B PERCENT_RANK 基于排名归一化 (rank-1)/(n-1),CUME_DIST 基于累积行数比例 (<=当前行)/n ✓ 正确答案
C CUME_DIST 基于排名
D 两者都返回 0 到 n
#

52. dense_rank 与 rank 的核心区别?

A 两者完全等价
B rank 无并列
C dense_rank 跳号
D rank 并列后跳号(1,1,3),dense_rank 不跳号(1,1,2) ✓ 正确答案
#

53. frame_clause 中 PRECEDING、FOLLOWING 的语义?

A PRECEDING 指当前行之后
B PRECEDING 指当前行之前的行,FOLLOWING 指之后的行,UNBOUNDED 表示分区首/末行 ✓ 正确答案
C 两者等价
D FOLLOWING 指当前行之前
#

54. CYCLE 子句的 path 列如何存储访问路径?

A path 列存储随机数
B path 列存储深度
C path 列是数组,记录从起点到当前节点的访问路径,用于检测环并防环 ✓ 正确答案
D path 列与防环无关
#

55. WITH RECURSIVE 关键字为何是必需的?

A 可以省略
B 它禁制自引用
C 只在 SQL Server 需要
D 它显式声明 CTE 递归自引用,无它时 CTE 不能引用自身,主要用于明确意图与防误用 ✓ 正确答案
#

56. NTILE(4) 的语义?

A 只返回第 4 桶
B 返回前 4 行
C 把结果分成 4 个尽量均匀的桶,为每行分配 1-4 的桶号 ✓ 正确答案
D 桶号从 0 开始
#

57. ROWS 与 RANGE 的差异举例?

A ROWS 按值,RANGE 按行号
B RANGE 不支持 ORDER BY
C 两者等价
D ROWS 按行位置,RANGE 按值且同值 peer 行整组纳入,导致同值行累计值相同 ✓ 正确答案
#

58. 窗口函数中 IGNORE NULLS/RESPECT NULLS 对 LAG/FIRST_VALUE 结果的影响

A IGNORE NULLS 让 LAG/FIRST_VALUE 跳过 NULL 取有效值 ✓ 正确答案
B RESPECT NULLS 跳过 NULL
C 两者影响聚合函数
D IGNORE NULLS 是默认