题解 | #店铺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.2上架新商品,那在统计10.1的时候也会把这个商品统计进去
3 回复 分享
发布于 2022-11-16 17:38 福建
牛!!! 不过,如果10.1到10.3之间有新上架商品,就不行了。虽然代码过了,只是后台测试数据不足而已。感觉还是得分别求出三天的值,再union。
3 回复 分享
发布于 2022-09-28 16:18 上海
第二个子查询,如果10-1号上架一个商品,就不行了,要加条件
2 回复 分享
发布于 2022-04-23 15:49
还是你这个牛 话说IF(shop_id != 901, null, product_id) 这句是不是没必要 直接WHERE shop_id = 901 结果也一样 有什么差别吗
2 回复 分享
发布于 2022-04-04 00:26
竟然还可以在select中使用子查询,牛!有点疑问,这个语句的执行顺序到底是啥样的呀
1 回复 分享
发布于 2022-07-27 17:08
第十一行的子查询厉害了
1 回复 分享
发布于 2022-05-02 23:25
妈呀,大佬 好牛。。
点赞 回复 分享
发布于 02-16 14:47 北京
思路天才
点赞 回复 分享
发布于 2024-08-20 09:15 广东
提问:19行的from是最先执行的吗?因为select里的子查询用了表的别名,是从这里来的。所以,即使子查询优先但也只是在他所在的语句(这里是select)内部优先?而from优先于select,所以先执行from,知道运行到select语句,再子查询?
点赞 回复 分享
发布于 2024-06-25 10:56 浙江
厉害了!
点赞 回复 分享
发布于 2024-01-29 23:34 广东
第一个子查询中‘between 0 and 6'换成‘<=6'为什么输出结果不一样?
点赞 回复 分享
发布于 2024-01-28 17:25 上海
这个写法并没有判断商品是否在线
点赞 回复 分享
发布于 2023-12-18 00:52 四川
DATE(event_time) BETWEEN '2021-10-01' AND '2021-10-03'有问题呀,date的between范围是左闭右开,不包含10月3号
点赞 回复 分享
发布于 2023-11-02 16:00 北京
啊啊啊
点赞 回复 分享
发布于 2023-03-09 12:59 广东
请问为什么子查询cnt的where可以使用外层查询的表to1呀?而且我把to1这个别名放在子查询cnt的tb_order_overall后面就报错,这是为啥?
点赞 回复 分享
发布于 2023-02-16 21:59 湖北
第一个子查询中与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 湖北
如果10月2号有上架产品,或者10月2号,有一个产品卖完了,不在售了。这两种情况第二个子查询需要加条件
点赞 回复 分享
发布于 2022-12-20 18:49 北京
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 北京
如果9.30号有交易, 但是10.1-10.3这三天有一天或几天没有交易呢?
点赞 回复 分享
发布于 2022-08-24 17:29 北京

相关推荐

深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
05-09 13:22
门头沟学院 Java
点赞 评论 收藏
分享
评论
110
18
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务