考拉运营"小明"负责多个品牌的销售业绩,请完成:
(1)请统计小明负责的各个品牌,在2017年销售最高的3天,及对应的销售额。
销售表 a:
字段:logday(日期,主键组),SKU_ID(商品SKU,主键组),sale_amt(销售额)
商品基础信息表 b:
字段:SKU_ID(商品SKU,主键),bu_name(商品类目),brand_name(品牌名称),user_name(运营负责人名称)
(2)请统计小明负责的各个品牌,在2017年连续3天增长超过50%的日期,及对应的销售额。
(1)第一题比较常规
select t.brand_name,t.a.sale_amt,a.logday from
(select *,row_number(partition by b.brand_name order by sale_amt desc) rn from
a join b on a.SKU_ID=b.SKU_ID
where year(logday)=2017 and user_name='小明')
where t.rn=1
(2)第二题有点复杂,这里会用到一个窗口函数lead()
作用:Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。
语法:
lag(exp_str,offset,defval) over(partion by ..order by …)
lead(exp_str,offset,defval) over(partion by ..order by …)
其中exp_str是字段名
Offset是偏移量,即是上1个或上N个的值,假设当前行在表中排在第5行,则offset 为3,则表示我们所要找的数据行就是表中的第2行(即5-3=2)。
Defval默认值,当两个函数取上N/下N个值,当在表中从当前行位置向前数N行已经超出了表的范围时,lag()函数将defval这个参数值作为函数的返回值,若没有指定默认值,则返回NULL,那么在数学运算中,总要给一个默认值才不会出错。
参考:https://blog.csdn.net/pelifymeng2/article/details/70313943
这里为了方便,先创建一个两表连接后的视图,命名为品牌日销售额brand_day_sale
select
(select brand_name,
logday,
sale,
lead(sale,1) over(partition by brand_name order by logday)as sale1,
lead(sale,2) over(parition by brand_name order by logday) as sale2,
lead(sale,3) over(partition by brand_name order by logday) as sale3
from brand_day_sale
order by brand_name,logday)t1
where sale1/sale>1.5
and sale2/sale1>1.5
and sale3/sale2>1.5
参考:https://www.nowcoder.com/test/question/done?tid=33332511&qid=168632#summary