17. 订单金额趋势分析

文章讲述了如何利用Hive的SQL查询语句,结合窗口函数over(range)来计算订单信息表中截止每天的最近3天内订单金额的总和及日平均值,包括两种不同的实现方法,并提供了相关学习链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目需求

查询截止每天的最近3天内的订单金额总和以及订单金额日平均值,保留两位小数,四舍五入。

最近三天 的业务逻辑通常是基于当天往前推2天

期望结果如下:

create_date (日期)total_3d <decimal(16,2)> (最近3日订单金额总和)avg_3d <decimal(16,2)> (最近3日订单金额日平均值)
2020-10-0875970.0075970.00
2021-09-27104970.0052485.00
2021-09-28175470.0058490.00

需要用到的表:

订单信息表:order_info

order_id (订单id)user_id (用户id)create_date (下单日期)total_amount (订单金额)
11012021-09-3029000.00
101032020-10-0228000.00
思路一

在这里插入图片描述

实现一
select t2.create_date,
       -- 计算出最近3天中,共有几天有订单记录
       -- count(*),
       -- 计算出最近3天中,订单金额的总和
       round(sum(t3.total_amount_for_everyday), 2)            as total_3d,
       round(sum(t3.total_amount_for_everyday) / count(*), 2) as avg_3d
from (
         -- 3)使用 explode 炸开 list,形成 create_date, create_date
         --                              create_date, create_date - 1
         --                              create_date, create_date - 2

         -- 2)统计每个 create_date 最近3天内 的date,并放到list中
         select create_date,
                -- 注: 该方式计算的不是最近3日(是物理级别上的最近3条记录)
                -- collect_list(create_date) over(order by create_date rows between 2 preceding and current row)
                last_3_days
         from (
                  -- 1) 按 create_date 去重,并升序排序
                  select distinct create_date
                  from order_info
                  order by create_date
              ) t1
                  lateral view explode(
                          array(create_date, date_add(create_date, -1), date_add(create_date, -2))) tmp as last_3_days
     ) t2

         join

     (
         -- 3)统计每个日期的销售总额
         select create_date,
                sum(total_amount) as total_amount_for_everyday
         from order_info
         group by create_date
     ) t3
     on t2.last_3_days = t3.create_date
group by t2.create_date;
实现二:使用 over(range)
-- 方法二(节选SQL): 使用 over(range)

-- 2)统计每个 create_date 最近3天内 的date,并放到list中
select create_date,
       -- 注: 在对 yyyy-MM-dd 型 string 数据做加减法时,需要做一个类型转换 cast(xxx as date)
       collect_list(create_date) over (order by cast(create_date as date) range between 2 preceding and current row)
from (
         -- 1) 按 create_date 去重,并升序排序
         select distinct create_date
         from order_info
         order by create_date
     ) t1
学习链接

hive开窗函数中range和rows的区别

题目来源

http://practice.atguigu.cn/#/question/17/desc?qType=SQL

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dataer__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值