开发函数踩坑记 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
。