SQL--over()开窗函数的应用

SQL学习笔记 - 窗口函数OVER

嘿,窗口函数,说实话,当我开始使用它们时,我真的很困惑。
我记得我当时在一家电商公司做数据分析。
我必须在年底准备一份报告。
模式非常详细,有不同的排名和前后比较,这让我头晕。

你提到的所有陷阱我基本上都经历过。
让我告诉你我的经历。

第一个是 PARTITION BY。
这个东西就像分箱一样,但它不是聚合,而是将数据分成多个块,并分别计算每个块。
当我在银行做客户分析时,我必须按地区对客户进行分类,然后按年龄计算每个地区的平均存款。
如果你不懂分区,不直接使用聚合函数,那么数据就会全部混在一起,这肯定是错误的。
因此,请记住,使用partition by划分块,并使用order by或其他窗口函数在块内进行计算。

ORDER BY 应该受到更多关注。
记得有一次我按订单金额排序,发现有的客户下了多个订单,总金额排在第一位,但客户的实际价值并不是最高的。
后来我发现我必须先按客户ID排序,然后再按金额排序。
如果不注意排序,报表数据就会完全乱七八糟。

ROW_NUMBER、RANK 和 DENSE_RANK,当我为电子商务企业进行销售排名时,我必须根据销售额对其进行排名。
有的卖家每天卖出很多单,总金额排名第一,但有的卖家每天只卖出一个订单,金额虽小,但回头率很高。
此时,如果使用 RANK,重复项将被忽略。
如果您使用 DENSE_RANK,它们将不会被忽略。
这取决于业务需求。
我当时选择了DENSE_RANK,老板也很满意。

LAG和LEAD,当时我在一家物流公司做数据分析,就看每个订单的发货和收货的时间差。
使用LEAD查看下一个订单的发货时间,使用LAG查看上一个订单的收货时间。
你立刻就能明白。
如果没有这两个函数,我们就必须编写一堆子查询,这将是令人不知所措的。

FIRST_VALUE和LAST_VALUE,我在一家游戏公司做用户行为分析,它取决于每个用户第一次和最后一次登录的时间。
使用FIRST_VALUE和LAST_VALUE立即出现,这比我自己编写查询要快得多。

NTILE 这个,我正在对一家教育公司的学生学习进行分析,我必须将学生分为几个层次。
NTILE 用于将学生分为五个级别。
注明了学生人数和每年的平均分。
您可以立即看到学生应该关注的内容。

滑动窗口,我在金融公司做股票分析的时候,要看每天的涨跌幅,还要计算每天的均线。
这是使用滑动窗口一次性完成的,这比我自己编写查询要快得多。

一般来说,如果窗函数不错的话使用起来,确实可以避免很多麻烦。
但也要注意,如果用错了,数据就会混乱,导致出现问题。
因此,需要多练习、多思考,才能真正用好窗口函数。