一、题目
已知有表如下,记录了每个产品id、产品名称、产品销售开始日期、产品销售结束日期以及产品日均销售金额,请计算出每个产品每年的销售金额。

二、思路
要计算每个产品每年的销售金额,需要得到每年的销售明细,观察数据可以发现有销售开始和结束日期,可以借此得到每个产品每天的销售额,lateral view posexplode可以实现数据膨胀的功能,最后按年份聚合销售额。

三、解答
select
product_id,
product_name,
year(sale_date) sale_year,
sum(average_daily_sales) sale_amount
from (
-- 每个产品每天的销售额明细
select
product_id,
product_name,
period_start,
period_end,
average_daily_sales,
duration_date, -- 时间间隔
date_add(period_start, idx) sale_date,
idx,
val
from (
select
product_id,
product_name,
date_format(period_start, 'yyyy-MM-dd') period_start,
date_format(period_end, 'yyyy-MM-dd') period_end,
datediff(date_format(period_end, 'yyyy-MM-dd'), date_format(period_start, 'yyyy-MM-dd')) duration_date, -- 时间间隔
average_daily_sales
from xse_product_sales
) t11
lateral view posexplode(split(repeat('1,', duration_date), ',')) tab_ as idx, val
) t21
group by product_id,
product_name,
year(sale_date)结果:

数据
# 建表
--建表语句
create table if not exists mst.xse_product_sales(
product_id bigint,
product_name string,
period_start string,
period_end string,
average_daily_sales bigint
) comment '查询每个产品每年总销售额'
stored as parquet
;
--插入数据
insert into xse_product_sales
values (1, 'LC Phone', '2019-01-25 00:00:00', '2019-02-28 00:00:00', 100),
(2, 'LC T-Shirt', '2018-12-01 00:00:00', '2020-01-01 00:00:00', 10),
(3, 'LC Keychain', '2019-12-01 00:00:00', '2020-01-31 00:00:00', 1);注:题目获取自网络
评论