其他分享
首页 > 其他分享> > 商品销售状态明细计算

商品销售状态明细计算

作者:互联网

商品销售状态明细
交付的维度: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

标签:sku,商品销售,明细,cast,ws,计算,poi,dt,id
来源: https://blog.csdn.net/qq_38215991/article/details/122134321