商品销售状态明细计算

商品销售状态明细
交付的维度:dt+poi+sku
现有的维度:dt+poi+sku+hour

**背景:**需求方要求在一条数据中将该商品一天内该商品状态变化的时间点以及变化后的状态显示出来

**难点:**商品一天可能变化多次(hour),如何将商品变化的时间和变换后的状态一一对应的显示在一条数据中

**解决方案:**通过map的形式将数据显示在后面

具体思路:
1:运用concat_ws对每条数据的utime(变化时间)和sale_status(商品状态)进行拼接
2:按dt+poi+sku进行group by 并用collect_set将其(utime,sale_status)联合变成数组
3:同时运用concat_ws将其变成字符串,同时用逗号把每对kv对分割开来
4: 最后用str_to_map函数将其转换为map类型即可(这样可以使用map类型专用的函数)

复盘:
第2步用collect_set将其变成数组时其实里面的kv对就是用逗号分割的了,只是类型为数组。为何第三步不能直接cast成string

原因:因为第二步的结果虽然是数组,但是cast是将数据整体转换成了string,连【】都不会去掉 。而如果用concat_ws可以将整个数组拆开,不会保留【】

用collect_set:{“1640188800000”:“0”,“1640271194000”:“1”}
运用cast后:{"[1640188800000":“0”," 1640271194000":“1]”}

用concat_ws

select
dt
,poi_id
,base_sku_id
,str_to_map(concat_ws(',',collect_set(concat_ws(':',utime,cast(sale_status as string)))))  as  complaintDetail
from aa
where 
dt = '20211223'
and base_sku_id=220970
and poi_id=10000275
GROUP BY
dt
,poi_id
,base_sku_id



用cast

select
dt
,poi_id
,base_sku_id
,str_to_map(cast(collect_set(concat_ws(':',utime,cast(sale_status as string))) as string))  as  complaintDetail
from mart_mall.dim_op_pdt_poi_sku_status_da 
where 
dt = '20211223'
and base_sku_id=220970
and poi_id=10000275
GROUP BY
dt
,poi_id
,base_sku_id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值