’
SUM (CASE WHEN jdbz = '进' THEN 1 ELSE 0 END) OVER (PARTITION BY jyds_yhkh, jyds_mc ORDER BY jysj RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS in_trades
各部分说明
-
SUM (CASE WHEN jdbz = '进' THEN 1 ELSE 0 END):
- 这是一个条件聚合表达式。它检查
jdbz
列的值是否等于'进'
。 - 如果
jdbz
等于'进'
,则返回1
,否则返回0
。 SUM
函数对这些1
和0
进行累加。
- 这是一个条件聚合表达式。它检查
-
OVER (PARTITION BY jyds_yhkh, jyds_mc ORDER BY jysj RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW):
OVER
子句定义了窗口函数的作用范围。- PARTITION BY jyds_yhkh, jyds_mc:
- 将数据按
jyds_yhkh
和jyds_mc
两列进行分区。每个分区独立计算。
- 将数据按
- ORDER BY jysj:
- 按
jysj
列进行排序,确保计算是按时间顺序进行的。
- 按
- RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:
- 定义了窗口范围从分区的开始到当前行。
目的
此语句的目的是计算每个分区内,从开始到当前行,符合 jdbz = '进'
条件的累计次数。
示例
假设有一个交易数据表 transactions
,其部分数据如下:
jyds_yhkh | jyds_mc | jysj | jdbz |
---|---|---|---|
1 | A | 2021-01-01 | 进 |
1 | A | 2021-01-02 | 出 |
1 | A | 2021-01-03 | 进 |
1 | B | 2021-01-01 | 进 |
1 | B | 2021-01-02 | 进 |
2 | A | 2021-01-01 | 出 |
2 | A | 2021-01-02 | 进 |
应用上述窗口函数后的结果:
jyds_yhkh | jyds_mc | jysj | jdbz | in_trades |
---|---|---|---|---|
1 | A | 2021-01-01 | 进 | 1 |
1 | A | 2021-01-02 | 出 | 1 |
1 | A | 2021-01-03 | 进 | 2 |
1 | B | 2021-01-01 | 进 | 1 |
1 | B | 2021-01-02 | 进 | 2 |
2 | A | 2021-01-01 | 出 | 0 |
2 | A | 2021-01-02 | 进 | 1 |
总结
这段 SQL 语句利用窗口函数和条件聚合来计算每个分区内符合特定条件的累计次数。在实际使用中,这样的语句可以用于统计某些特定类型的累计交易次数等场景。
在SQL中,RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
是用于窗口函数的一种子句,用来定义窗口内的行范围。这句话的意思是:
RANGE
: 指定窗口的范围是基于值而不是行的数量。UNBOUNDED PRECEDING
: 窗口从分区的第一行开始。CURRENT ROW
: 窗口结束于当前行。
举个例子,假设我们有一张包含员工工资信息的表,我们想计算每个员工当前工资以及之前所有工资的总和。可以使用下面的SQL查询:
sql
复制代码
SELECT employee_id, salary, SUM(salary) OVER ( ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS running_total FROM employees;
在这个查询中,SUM(salary) OVER (ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
将计算每个员工工资的累积和,从分区的第一行开始,一直到当前行。