OVER、PARTITION BY、ORDER BY
理解窗口函数模型:OVER、PARTITION BY(分组)、ORDER BY(排序),以及它与 GROUP BY 的区别。
OVER、PARTITION BY、ORDER BY 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
什么是窗口函数
窗口函数会在与当前行相关的一组行上计算值,而不会像 GROUP BY 那样合并结果。您可以保留每一行,并且获得一个聚合列。
基本示例
在每一行显示整张表的平均订单总额:
SELECT id, total,
AVG(total) OVER () AS avg_total
FROM orders;OVER 子句
OVER (...) 子句定义窗口。空括号表示“整个结果集”。
SELECT id, total,
SUM(total) OVER () AS grand_total
FROM orders;PARTITION BY:对窗口分组
它类似于 GROUP BY,但不会合并行:
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id) AS user_total
FROM orders;
-- Every order keeps its row; user_total is the same for all of one user's orders.窗口中的 ORDER BY
OVER 中的 ORDER BY 定义运行计算时的行顺序:
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id ORDER BY created_at) AS running_total
FROM orders;
-- Running total per user, ordered by date.窗口函数与 GROUP BY
并列比较:
-- GROUP BY: 1 row per user
SELECT user_id, SUM(total) FROM orders GROUP BY user_id;
-- Window: 1 row per order, with user total alongside
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id)
FROM orders;每一行,不同的框架
“框架”是分区中函数会查看的行集合。带有 ORDER BY 时,默认框架是“从开始到当前行” — 这正是累计总额的实现方式。
命名窗口
如果多个函数共享一个窗口,可以只命名一次:
SELECT id, user_id, total,
SUM(total) OVER w AS running_sum,
AVG(total) OVER w AS running_avg
FROM orders
WINDOW w AS (PARTITION BY user_id ORDER BY created_at);大多数聚合函数都可以作为窗口函数使用
COUNT、SUM、AVG、MIN、MAX 都可以在窗口上使用。专用窗口函数还包括 ROW_NUMBER、RANK、LAG/LEAD、NTILE 等。
窗口函数在 WHERE 之后运行
逻辑顺序为:FROM → WHERE → GROUP BY → HAVING → window functions → SELECT → ORDER BY → LIMIT。因此,WHERE 会在窗口函数计算之前进行筛选。
性能注意事项
窗口函数需要排序(或使用哈希)。对于较大的分区,在(分区列、排序列)上建立索引可以避免排序步骤。
回顾
窗口函数可以为每一行添加聚合值。
- OVER () = 整个结果
- PARTITION BY = 对窗口分组
- 窗口中的 ORDER BY = 启用累计计算
快速检查
SUM(x) OVER (PARTITION BY user_id) 会计算什么?
常见问题解答
「OVER、PARTITION BY、ORDER BY」课时是免费的吗?
是的 — 「OVER、PARTITION BY、ORDER BY」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「OVER、PARTITION BY、ORDER BY」这节课中我会学到什么?
理解窗口函数模型:OVER、PARTITION BY(分组)、ORDER BY(排序),以及它与 GROUP BY 的区别。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「OVER、PARTITION BY、ORDER BY」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- OVER、PARTITION BY、ORDER BY
- ROW_NUMBER、RANK、DENSE_RANK
- LAG、LEAD 与时间序列模式
- 累计总计与移动平均