一、题目

已知有表如下,记录了每个产品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);

注:题目获取自网络