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;
复制代码
posted @   晓枫的春天  阅读(167)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
历史上的今天:
2022-04-23 实时项目概述
点击右上角即可分享
微信分享提示