drois开窗累计和计算

使用场景:实时数据,同一数据流中,即要小时分段销售金额,也需要累计值金额

技术方案使用flink加工流式数据,如果采用按累计开窗,会对状态使用内存占比高,控制整点小时触发,但是不建议使用,可以使用按小时分段计算的方式,累计值 使用开窗函数进行聚合,sink表为mysql8,可以跳转,如果是mysq5.7,就菜B了,不过还有一种方式,那就是sink换成 doris,也能有效的支持这种场景,下面是示例,doris 做实时查询的并发后续待验证

drop table IF EXISTS doris_db.t2;
CREATE TABLE IF NOT EXISTS doris_db.t2
(
    `dt` INT(10) NOT NULL COMMENT "日期",
    `h` INT(10) NOT NULL COMMENT "时间段",
    `amt` DECIMAL(9,2) COMMENT "金额"
)
UNIQUE KEY(`dt`,`h`)
DISTRIBUTED BY HASH(`dt`,`h`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"enable_unique_key_merge_on_write" = "true"
);

insert into doris_db.t2 values('20240101',1,1.1);
insert into doris_db.t2 values('20240101',2,2.1);
insert into doris_db.t2 values('20240101',3,3.1);
insert into doris_db.t2 values('20240101',4,4.1);
insert into doris_db.t2 values('20240101',5,5.1);
insert into doris_db.t2 values('20240101',5,6.1);

明细
'2024010101',1.1
'2024010102',1.1
'2024010103',1.1

效果
'2024010101',1.1
'2024010102',2.2
'2024010103',3.3

select dtime,  
sum(amt) over    
(   
partition by dtime  
) as 'amt'    
from doris_db.t2 
;

select 
    dt,h, sum(amt) over( 
    partition by dt order by h
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    )   as sum_amt
from doris_db.t2 
order by dt,h
;

结果效果
+----------+------+---------+
| dt       | h    | sum_amt |
+----------+------+---------+
| 20240101 |    1 |    1.10 |
| 20240101 |    2 |    3.20 |
| 20240101 |    3 |    6.30 |
| 20240101 |    4 |   10.40 |
| 20240101 |    5 |   16.50 |
+----------+------+---------+

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值