拼多多大数据开发工程师SQL实战解析 (2)

这题比较简单,分析了这么多,可以直接写SQL语句了:

SELECT DATE_FORMAT(t.order_time,'%Y-%m') AS '日期', SUM(t.order_amount) AS '销售金额' FROM orders t WHERE YEAR(t.order_time) = 2018 GROUP BY MONTH(t.order_time)

执行结果正确,如图:

拼多多大数据开发工程师SQL实战解析

请统计2018年每月销售金额,以及金额排名。

日期 销售金额 金额排名
2018-01   ****   2  
2018-02   ****   3  
...   ...   ...  
2018-12   ****   9  

这个题是要求销售金额的排名情况,求这个月的销售额在这一年的12月中排第几,需要得到具体排第几名。比如说2018年1月的销售金额在12个月中排第2名。不是用ORDER BY粗暴的进行排序完事!不是用ORDER BY粗暴的进行排序完事!不是用ORDER BY粗暴的进行排序完事!这个是我理解的题意。

对于这个问题,我刚开始也是比较懵逼的,没有思路。感觉这道题还有点东西哈。网上搜索了一下,没有找到和我这个需求一模一样的,看了一些相似的博客,然后从这些博客中找到了解答本题的思路。

在这过程中我也尝试着在某个技术交流群里面请教了一下各位技术大佬,有说用ORDER BY就好了的,有说用LIMIT的,还有的说问这么傻的问题。。。如果一个ORDER BY就可以轻易解答这个问题,我特么用得着来群里问你们?只好留下一句”我们的ORDER BY好像不是太一样,打扰了“,然后默默离开,没有失望,也没有愤怒。

因为我多年前早也经习惯了,习惯了大多数时候在群里面请教问题,不仅得不到满意的解答,反而会遭到各种冷嘲热讽。我也常常在反思这个问题,别人的问题难倒真的没有一丝价值吗?难倒我们真的是别人口中所说的“技术大佬”,别人的难题对于自己来说都不算是问题吗?有些时候,看到一些交流群里的问题,貌似很简单,但是有时候做起来还真的不好做;就像面试的时候手撕个很简单的算法(比如快速排序、堆排序),很难保证“一次编写,到处正确运行”。所以,面对别人的问题,我都告诉自己要认真对待。因为大多数人是在自己解决不了的时候才会把问题抛出来,没有谁天生喜欢厚着脸皮去求人解答,这往往是更有价值的问题,是有助于提高自己的问题。哎,好像扯得有点远了。下面继续说这个问题。

看了看网上相似的问题,结合自己的分析,我觉得这道题完全可以解答出来,即使我使用的是MySQL数据库(MySQL数据库不能使用rank()函数)。这个问题可以分三个步骤解决:

在第(1)问的基础上按照销售金额进行排序;要求排名,当然先要按销售金额排序。

ORDER BY 用于对结果集按照一个列或者多个列进行排序。基本语法如下:

SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC;

对金额进行排序(降序需要加上DESC关键字):

SELECT DATE_FORMAT(t.order_time,'%Y-%m') AS mon, SUM(t.order_amount) AS sum FROM orders t WHERE YEAR(t.order_time) = 2018 GROUP BY MONTH(t.order_time) ORDER BY SUM(t.order_amount) DESC

为了排序和之后的效果显示,我又在表格中插入了2018年4月的记录。排序之后的结果如图所示:

拼多多大数据开发工程师SQL实战解析

对排序的结果添加一个排名列;其实就是在上图结果后面添加一个排名字段。这里自定义一个排名变量rank,初始化为0,由于数据已经是排好序的,所以每次加1就是排名,从而实现一个取得排序后名次的效果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyywyd.html