开发函数踩坑记 sum(1) over(partition by stock_code order by trade_date asc)
在 SQL 中,sum(1) over(partition by sac.stock_code order by sac.trade_date asc) 是窗口函数的一种应用,以下是对它的详细解释:
-
sum(1):这里sum是聚合函数,1是要进行求和的表达式。由于1是常量,每一行的1相加,实际上就是对行数进行计数(因为每一行的1相加的结果就等同于行数)。 -
over子句:over子句定义了窗口的范围和计算的逻辑。partition by sac.stock_code:按照sac.stock_code字段的值对数据进行分组。也就是说,会分别对每个不同的stock_code组进行计算。例如,如果有多个不同的stock_code值,会分别计算每个stock_code组内的结果。order by sac.trade_date asc:在每个分组内,按照sac.trade_date字段升序排列。这会影响sum函数的计算顺序。例如,对于每个stock_code组,会按照trade_date从早到晚的顺序依次对行进行处理来计算累计的和(这里是累计的行数)。
举个例子,假设有以下数据:
| stock_code | trade_date |
|---|---|
| A | 2025-01-01 |
| A | 2025-01-02 |
| B | 2025-01-01 |
| B | 2025-01-02 |
| B | 2025-01-03 |
对于上述数据,sum(1) over(partition by stock_code order by trade_date asc) 的计算过程如下:
-
对于
stock_code为A的组:- 第一行
trade_date为2025-01-01,sum(1)结果为1(因为此时累计行数为1)。 - 第二行
trade_date为2025-01-02,sum(1)结果为2(累计行数为2)。
- 第一行
-
对于
stock_code为B的组:- 第一行
trade_date为2025-01-01,sum(1)结果为1。 - 第二行
trade_date为2025-01-02,sum(1)结果为2。 - 第三行
trade_date为2025-01-03,sum(1)结果为3。
- 第一行
最终结果会增加一个新的列,显示每个组内按日期顺序累计的行数。
PS:很多人会理解成三天的日期聚合后都是3
- 第一行
trade_date为2025-01-01,sum(1)结果为 3。 - 第二行
trade_date为2025-01-02,sum(1)结果为 3。 - 第三行
trade_date为2025-01-03,sum(1)结果为3。
