在上次的面试过程中,遇到了一个数据分析的经典面试题,题目大概的是这样的:
求出每个店铺销量为第二的销量数和日期值
本题解析(方法一):本题主要考察我们分组求第N值的方法,通过运用mysql8中的窗口函数的row_number()函数,按照shopname分组,按照sales降序排序,得到出每个分组中的行号,然后通过子查询让rank_num = 2,即可求出每个店铺销量为第二的销量数和日期值。
代码演示:
-- 练习:求出每个店铺销量为第二的销量数和日期值(方法一) select shopname, sale_date, sales from (select shopname, sales, sale_date, row_number() over (partition by shopname order by sales desc ) as rank_num from demo.chapter11) rank_table where rank_table.rank_num = 2;
运行结果:
本题解析(方法二):通过运用where子查询,按照sales降序排序,取第二个值,也可以得出结果
代码演示:
SELECT * FROM demo.chapter11 AS t2 WHERE sales = ( SELECT sales FROM chapter11 AS t1 WHERE t1.shopname = t2.shopname ORDER BY sales DESC LIMIT 1, 1 );
运行结果:
通过上面结果似乎达到我们的预期结果,通过窗口函数和子查询均可以得到结果,窗口函数这种写法更易理解一写,不知道还有哪位高手可以写出其他的写法!
数据源:chapter11.csv
shopname,sales,sale_date A,1,2020/1/1 B,3,2020/1/1 C,5,2020/1/1 A,7,2020/1/2 B,9,2020/1/2 C,2,2020/1/2 A,4,2020/1/3 B,6,2020/1/3 C,8,2020/1/3