这个问题是考察分组排名的问题:按照商品类目进行分组,按goods_id统计行数作为销量,找出每个商品种类销量前2名的goods_id,并给出排名。如果已经完全理解了第2问的使用自定义变量来实现添加排名操作,这一问做起来会轻松许多。
销量怎么计算?题目中没有明确说明,我理解的销量应该是表中的记录行数。统计记录行数需要使用COUNT()函数,基本语法如下:
SELECT COUNT(column_name) FROM table_name这个问题也可以分三个步骤解决:
统计出来每种商品的销量,并按照类目、销量进行排序;这里由于表中的数据库记录较少,所以我直接统计的是2018年全年的数据,其实道理是一样的。SQL语句如下:
SELECT a.cate,a.goods_id,a.count FROM ( SELECT t.cate,t.goods_id,count(goods_id) AS count FROM orders t WHERE date_format(t.order_time, '%Y%m%d%H%i%s')LIKE "2018%" GROUP BY t.goods_id ORDER BY t.cate,count(t.goods_id) DESC ) AS a执行结果如图:
使用自定义变量为排序结果添加排名。原理和用法与上一个问题是一样的,这里不赘述了。SQL语句如下:
SELECT a.cate,a.goods_id,a.count, @rank:= CASE WHEN @prevCate=a.cate THEN @rank+1 ELSE 1 END AS rankNO, @prevCate:=a.cate AS type FROM ( SELECT t.cate,t.goods_id,count(goods_id) AS count FROM orders t WHERE date_format(t.order_time, '%Y%m%d%H%i%s')LIKE "2018%" GROUP BY t.goods_id ORDER BY t.cate,count(t.goods_id) DESC ) AS a,(SELECT @rank:=0 ,@prevCate:='') b执行结果如图:
根据rankNO筛选前2名并按照题目要求格式返回;由于前面的铺垫,只需要用WHERE对rankNO进行筛选。SQL语句如下:
SELECT t.cate AS '类目',t.goods_id AS '商品id',t.rankNO AS '排名' FROM (SELECT a.cate,a.goods_id,a.count, @rank:= CASE WHEN @prevCate=a.cate THEN @rank+1 ELSE 1 END AS rankNO, @prevCate:=a.cate AS type FROM ( SELECT t.cate,t.goods_id,count(goods_id) AS count FROM orders t WHERE date_format(t.order_time, '%Y%m%d%H%i%s')LIKE "2018%" GROUP BY t.goods_id ORDER BY t.cate,count(t.goods_id) DESC ) AS a,(SELECT @rank:=0 ,@prevCate:='') b) t WHERE t.rankNO <= 2执行结果和要求一模一样:
笔试已凉,但是学习之路没有终点。经过几天的学习和调试,终于解决了这个SQL语句的问题,也算是了却了一桩心事。
本文仅根据题目要求实现了基本功能,关于性能方面的问题还没有考虑。在大数据量的情况下这么写是否还可以接受呢?应该怎么优化?ORDEY BY排序以后相同数据顺序随机究竟和底层索引之间有怎么的联系?由于水平有限,这些问题我还需要再好好研究一番,也希望各位可以多指教。