SQL 刷题 累计订单金额问题
需求描述
现有订单信息表如下:
create table t_simple_order ( uid int, --用户id day_id date,--订单日期 ant numeric --订单金额 ); insert into t_simple_order values (1,'2023-02-01'),(1,'2023-03-02'),(1,'2023-04-02'); insert into t_simple_order values (2,'2023-03-11'),(2,'2023-03-15'),(2,'2023-04-01');
要求计算每个用户首次订单日期后30天内累计订单金额,要求输出,用户ID,首次订单日期,30天内累计订单累计金额
解题思路
题目其实很简单,第一步找出每个用户首次下单时间,此处可以使用聚合函数min对下单时间求最小值,就是首次下单,然后对每个用户每天的下单金额进行汇总,然后进行关联即可
参考实现
select t.uid, t.fisrst_day, sum(sum_ant) filter ( where t1.day_id between t.fisrst_day and (t.fisrst_day + 30) ) total_ant from (select uid, min(day_id) fisrst_day from t_simple_order group by uid) t left join (select uid, day_id, sum(ant) sum_ant from t_simple_order group by uid, day_id) t1 on t.uid = t1.uid group by t.uid, t.fisrst_day;
此处使用了 post过热SQL 为聚合函数的一个扩展项 filter 实现,也可以使用 case when 对时间进行过滤
select t.uid, t.fisrst_day, sum(case when t1.day_id between t.fisrst_day and (t.fisrst_day + 30) then sum_ant end) total_ant from (select uid, min(day_id) fisrst_day from t_simple_order group by uid) t left join (select uid, day_id, sum(ant) sum_ant from t_simple_order group by uid, day_id) t1 on t.uid = t1.uid group by t.uid, t.fisrst_day;
最后给出本题的Hive解法
select t.uid, t.fisrst_day, sum(if(t1.day_id between t.fisrst_day and date_add(t.fisrst_day,30), sum_ant, 0)) total_ant from (select uid, min(day_id) fisrst_day from t_simple_order group by uid) t left join (select uid, day_id, sum(ant) sum_ant from t_simple_order group by uid, day_id) t1 on t.uid = t1.uid group by t.uid, t.fisrst_day;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
2022-04-23 实时项目概述