doris中使用窗口函数实现累计数的统计

139 阅读2分钟

数据准备

CREATE TABLE IF NOT EXISTS index_date_value
(
    `dt` date NOT NULL COMMENT "日期",
    `amt` DECIMAL(9,2) COMMENT "金额"
)
UNIQUE KEY(`dt`)
DISTRIBUTED BY HASH(`dt`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"enable_unique_key_merge_on_write" = "true"
);

insert into index_date_value values('2024-01-01',1.0);
insert into index_date_value values('2024-01-02',2.0);
insert into index_date_value values('2024-01-03',2.0);
insert into index_date_value values('2024-01-04',2.0);
insert into index_date_value values('2024-01-05',3.0);
insert into index_date_value values('2024-01-06',3.0);
insert into index_date_value values('2024-01-07',3.0);

insert into index_date_value values('2024-02-01',2.0);
insert into index_date_value values('2024-02-02',2.0);
insert into index_date_value values('2024-02-03',3.0);
insert into index_date_value values('2024-02-04',4.0);
insert into index_date_value values('2024-02-05',5.0);
insert into index_date_value values('2024-02-06',6.0);


查询SQL

select 
    dt,amt, DATE_FORMAT(dt,'%Y-%m') as dm,sum(amt) over( 
    partition by DATE_FORMAT(dt,'%Y-%m') order by dt 
    )   as sum_amt
from index_date_value
order by dt;

结果

dt	amt	dm	sum_amt
2024-01-01	1.00	2024-01	1.00
2024-01-02	2.00	2024-01	3.00
2024-01-03	2.00	2024-01	5.00
2024-01-04	2.00	2024-01	7.00
2024-01-05	3.00	2024-01	10.00
2024-01-06	3.00	2024-01	13.00
2024-01-07	3.00	2024-01	16.00
2024-02-01	2.00	2024-02	2.00
2024-02-02	2.00	2024-02	4.00
2024-02-03	3.00	2024-02	7.00
2024-02-04	4.00	2024-02	11.00
2024-02-05	5.00	2024-02	16.00
2024-02-06	6.00	2024-02	22.00

说明

我们使用 DATE_FORMAT(dt,'%Y-%m') as dm 实现的日期格式化为月份,增加了一列,用来做窗口里的 partition字段。这样就能够按月来累计这一个月里 每一天的累计值。窗口里 按 日期排序,就能保证日期是从小到大的。再用 sum函数来求和,就能实现 累计值的计算了。