题解 | #店铺901国庆期间的7日动销率和滞销率#

店铺901国庆期间的7日动销率和滞销率

http://www.nowcoder.com/practice/e7837f66e8fb4b45b694d24ea61f0dc9

  • 感觉这六道题做了很久,每道题都很折磨。。。。。。
  • 这道题我本来思路是想直接用窗口函数统计10-01到10-03每天最近7日有销量的商品数目,然后发现窗口函数不能用DISTINCT,只能用子查询搜索和每天相近七天有销量的商品数目。
  • 第一个子查询对应查询每条record相距最近七天的产品,去重后输出
  • 第二个子查询对应查询整体有多少个独特的商品(DISTINCT product_id)
  • 欢迎大家指正!
SELECT dt, ROUND(cnt / total_cnt, 3) AS sale_rate, ROUND(1 - cnt / total_cnt, 3) AS unsale_rate
FROM
(
	SELECT DISTINCT
		DATE(event_time) AS dt,
		(
			SELECT COUNT(DISTINCT (IF(shop_id != 901, null, product_id)))
			FROM tb_order_overall
			JOIN tb_order_detail USING (order_id)
			JOIN tb_product_info USING (product_id)
			WHERE TIMESTAMPDIFF(DAY, event_time, to1.event_time) BETWEEN 0 AND 6
		) AS cnt,
		(
			SELECT COUNT(DISTINCT product_id)
			FROM tb_product_info
			WHERE shop_id = 901
		) AS total_cnt
	FROM tb_order_overall to1
	WHERE DATE(event_time) BETWEEN '2021-10-01' AND '2021-10-03'
) AS t0
ORDER BY dt;
全部评论
你还能做出来,我被折磨得直接看你的答案了
8 回复 分享
发布于 2022-05-25 18:25
牛!!! 不过,如果10.1到10.3之间有新上架商品,就不行了。虽然代码过了,只是后台测试数据不足而已。感觉还是得分别求出三天的值,再union。
3 回复 分享
发布于 2022-09-28 16:18 上海
还是你这个牛 话说IF(shop_id != 901, null, product_id) 这句是不是没必要 直接WHERE shop_id = 901 结果也一样 有什么差别吗
2 回复 分享
发布于 2022-04-04 00:26
第二个子查询,如果10-1号上架一个商品,就不行了,要加条件
2 回复 分享
发布于 2022-04-23 15:49
在售总数是不是要设置一下条件,按楼主这么写,如果在10.2上架新商品,那在统计10.1的时候也会把这个商品统计进去
2 回复 分享
发布于 2022-11-16 17:38 福建
第十一行的子查询厉害了
1 回复 分享
发布于 2022-05-02 23:25
竟然还可以在select中使用子查询,牛!有点疑问,这个语句的执行顺序到底是啥样的呀
1 回复 分享
发布于 2022-07-27 17:08
这个做法好,第一个子查询用的真的很妙
点赞 回复 分享
发布于 2022-04-06 20:07
是大佬
点赞 回复 分享
发布于 2022-04-22 16:30
大佬,为什么第11行不能用datediff函数呢?第11行的子查询怎么理解?
点赞 回复 分享
发布于 2022-06-09 16:20
第十一行的to1.event_time里的to1是什么?好像没命名这个表。还有没有group by怎么用count?求解释
点赞 回复 分享
发布于 2022-06-23 19:53
如果9.30号有交易, 但是10.1-10.3这三天有一天或几天没有交易呢?
点赞 回复 分享
发布于 2022-08-24 17:29 北京
select to_date(substr(t20.EVENT_TIME1,1,9),'YYYY/MM/DD'), round(count(distinct t20.PRODUCT_ID) / (select count( distinct PRODUCT_ID) from tb_product_info),3) to11, 1- round(count(distinct t20.PRODUCT_ID) / (select count( distinct PRODUCT_ID) from tb_product_info),3) to12 from ( select t1.EVENT_TIME EVENT_TIME1,t2.* from ( select t1.* ,t2.event_time from tb_order_detail t1 left join tb_order_overall t2 on t1.order_id=t2.order_id where to_date(EVENT_TIME,'YYYY/MM/DD hh24:mi:ss') between date'2021-10-1' and date'2021-10-4' ) t1 left join (select t1.* ,t2.event_time from tb_order_detail t1 left join tb_order_overall t2 on t1.order_id=t2.order_id ) t2 on 1=1 and to_date(t2.EVENT_TIME,'YYYY/MM/DD hh24:mi:ss') >= to_date(substr(t1.EVENT_TIME,1,9),'YYYY/MM/DD') -5 and to_date(t2.EVENT_TIME,'YYYY/MM/DD hh24:mi:ss') <= to_date(substr(t1.EVENT_TIME,1,9),'YYYY/MM/DD') +1 ) t20 group by to_date(substr(t20.EVENT_TIME1,1,9),'YYYY/MM/DD') order by to_date(substr(t20.EVENT_TIME1,1,9),'YYYY/MM/DD')
点赞 回复 分享
发布于 2022-12-04 12:52 北京
如果10月2号有上架产品,或者10月2号,有一个产品卖完了,不在售了。这两种情况第二个子查询需要加条件
点赞 回复 分享
发布于 2022-12-20 18:49 北京
第一个子查询中与to1.event_time间隔0-6的条件是10-01到10-03一个个匹配的吗,如果是一起匹配的不就达不到滚动的效果了,相当于每一条都筛选的09-25-10-03 而不是09-25到10-01,09-26到10-02,……这里不是很懂,跪求大佬解释
点赞 回复 分享
发布于 2023-02-15 00:23 湖北
请问为什么子查询cnt的where可以使用外层查询的表to1呀?而且我把to1这个别名放在子查询cnt的tb_order_overall后面就报错,这是为啥?
点赞 回复 分享
发布于 2023-02-16 21:59 湖北
啊啊啊
点赞 回复 分享
发布于 2023-03-09 12:59 广东
DATE(event_time) BETWEEN '2021-10-01' AND '2021-10-03'有问题呀,date的between范围是左闭右开,不包含10月3号
点赞 回复 分享
发布于 2023-11-02 16:00 北京
这个写法并没有判断商品是否在线
点赞 回复 分享
发布于 2023-12-18 00:52 四川
第一个子查询中‘between 0 and 6'换成‘<=6'为什么输出结果不一样?
点赞 回复 分享
发布于 01-28 17:25 上海

相关推荐

105 18 评论
分享
牛客网
牛客企业服务