窗口函数sum over

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

各部分说明

  1. SUM (CASE WHEN jdbz = '进' THEN 1 ELSE 0 END):

    • 这是一个条件聚合表达式。它检查 jdbz 列的值是否等于 '进'
    • 如果 jdbz 等于 '进',则返回 1,否则返回 0
    • SUM 函数对这些 10 进行累加。
  2. 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_yhkhjyds_mc 两列进行分区。每个分区独立计算。
    • ORDER BY jysj:
      • jysj 列进行排序,确保计算是按时间顺序进行的。
    • RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:
      • 定义了窗口范围从分区的开始到当前行。

目的

此语句的目的是计算每个分区内,从开始到当前行,符合 jdbz = '进' 条件的累计次数。

示例

假设有一个交易数据表 transactions,其部分数据如下:

jyds_yhkhjyds_mcjysjjdbz
1A2021-01-01
1A2021-01-02
1A2021-01-03
1B2021-01-01
1B2021-01-02
2A2021-01-01
2A2021-01-02

应用上述窗口函数后的结果:

jyds_yhkhjyds_mcjysjjdbzin_trades
1A2021-01-011
1A2021-01-021
1A2021-01-032
1B2021-01-011
1B2021-01-022
2A2021-01-010
2A2021-01-021

总结

这段 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) 将计算每个员工工资的累积和,从分区的第一行开始,一直到当前行

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值