CodeGym /课程 /SQL SELF /窗口函数:SQL 的隐藏超能力

窗口函数:SQL 的隐藏超能力

SQL SELF
第 29 级 , 课程 0
可用

一开始你可能觉得 SQL 已经啥都有了:GROUP BY、聚合函数、子查询……但这只是个开始。欢迎来到 窗口函数 的世界——这个强大的工具能让你 一行一行 地处理数据,还能保留所有上下文信息。

窗口函数可以让你对 “窗口”里的多行 做各种计算,比如求和、平均、排名啥的,而且不会把数据折叠起来。也就是说,和普通的聚合函数(SUM()AVG()COUNT())不一样,你能在每一行里 同时看到结果和细节

比如你想算一下每个订单的累计收入。如果用 GROUP BY,你就只能看到总和,具体订单都没了。但用窗口函数,你可以直接把结果加到每一行上,啥都不会丢。

窗口函数特别方便,因为它们不会破坏原始数据:每一行都还在,只是多了几个新列放计算结果。这样你就能在一个查询里搞定复杂分析,不用写子查询或者一堆嵌套——全都在一条 SQL 里搞定。像排名、滑动平均、行间对比这些需求,窗口函数简直就是神器。代码可读性高,结果也很准。

什么时候特别有用:

  • 员工、销售、产品排名——谁排第几。
  • 时间序列——每天、每周数据怎么变的。
  • 销售和财务——每一步累计多少,哪些订单高于平均,谁进了前 25%。

窗口函数用在哪儿

只要你关心 上下文,不只是结果,都能用:

  • 销售报表;
  • 客户行为分析;
  • 画累计指标的图表;
  • 数据分组(比如分四分位);
  • 算偏差和趋势。

对于天天用 SQL 的分析师来说,这些函数简直是宝藏。 下面我们看几个真实场景,窗口函数怎么帮你解决问题。

例子 1:数据排名

比如你有一堆学生的考试成绩,想给每个人排个名。用窗口函数就超简单。比如 RANK()ROW_NUMBER() 这些函数就能帮你搞定。

例子 2:时间数据分析

如果你想看公司每个月收入怎么变的?你需要 累计收入。用窗口函数 SUM() 加个窗口条件,结果就出来了。

例子 3:分位数和分组

想把数据分成几组(比如按收入分客户),做客户分层?这时候 NTILE() 就能帮你。比如看看哪些客户进了前 25%,哪些在底部。

长啥样?

窗口函数就是把结果直接加到数据集里:

SELECT
    student_id,
    grade,
    RANK() OVER (ORDER BY grade DESC) AS rank
FROM 
    students;

这样你就能得到一张表,每个学生都有自己的成绩排名。

简单类比

想象你和一群朋友一起跑步。每个人速度都不一样,但你想知道自己现在排第几。你不用让大家都停下来做个排行榜(GROUP BY 就是这么干的),你只要看看周围的人就能知道自己的当前排名。

这就是窗口函数:它不会让大家停下来,也不会把人分组——只是多加点信息,大家还在跑,细节都在。你还能多分析点,比如前面有几个人,你的速度和平均比咋样等等。

比传统方法牛在哪

来看个经典问题:给销售按收入排名。有两种做法:

  1. 不用窗口函数。你得写子查询,甚至嵌套好几个,先排序再编号。又长又难读。

  2. 用窗口函数。一条查询,语法清晰,结果直接出来。比如:

SELECT
    seller_id,
    revenue,
    RANK() OVER (PARTITION BY region ORDER BY revenue DESC) AS rank_in_region
FROM 
    sales;

这个查询直接按地区分组,然后按收入降序给每个销售排了名。

真实例子

假如你是分析师,要分析销售数据。你想知道:

  • 每个月的总收入,
  • 和上个月比收入变了多少,
  • 各地区总收入排名。

这些都能用窗口函数搞定,甚至一条 SQL 就能全做了。具体怎么写,咱们下节课再说。

现在你已经有了窗口函数的基础知识,可以去学它们的语法,感受下 ROW_NUMBER()RANK()DENSE_RANK()NTILE() 的威力。下一讲见!

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION