1 小时 SQL 极速入门
前面两篇我们从 SQL 的最基础语法讲起,到表联结多表查询。
大家可以点击链接查看
共 8 个订单,分为 A,B,C,D四种类型,后面两列是订单描述和订单数量。
假如我们现在想找到每个订单类型中数量最少的一行记录,比如想找到 A 类型订单数量最少的,B 类型订单数量最少的。。。
我们要怎么写呢 ? 用 GROUP BY 可能会很麻烦。这里用 ROW_NUMBER() 就很合适
SELECT order_no, order_type, order_text, order_qty, row_number() OVER(PARTITION BY order_type order by order_qty) AS rowno FROM wip_order_test 结果:
可以看到,每一行最后都有一个从低到高的编号,有了这个编号我们就可以通过取编号为 1 的行来得到每个分组中订单数量最少的一行记录。
解释一下,ROW_NUMBER() 为每一行返回一个行号, partition by 表示分组,这里表示根据 order_type 分组,然后我们按照订单数量排序。就会得到每个分组内的按照订单数量排序的行号。
SUM() OVER()函数
假如我们现在要 查询每个类型的订单总数分别是多少,要怎么做?
大家可能会想到 GROUP BY,不过大家可以自己试试,是否能得到和我同样的结果
SELECT order_no, order_type, order_text, order_qty, sum(order_qty) OVER(PARTITION BY order_type) AS sum_qty FROM wip_order_test 结果:
看到后面多了一个数量列,就是每个分组的订单总数量。是不是很方便?
除了 SUM 函数,其他几个计算函数如 AVG(),MAX(),MIN(),COUNT()的使用方法和 SUM 一样。
窗口函数
窗口函数可以对一个结果集内的一定范围内值进行累积,或者通过移动窗口进行累积。还是看例子吧。
SELECT order_no, order_type, order_text, order_qty, sum(order_qty) OVER (ORDER BY order_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_qty FROM wip_order_test; 
解释一下:还是用 SUM 来计算总和,这里我们使用了新的语法, ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 定义了窗口的起点和终点,UNBOUNDED PRECEDING表示起点在第一行,CURRENT ROW 表示终点在当前行。我们看一下上图的结果,能看到最后一列的值是逐行累加的。
移动窗口
上面我们的窗口的起点是固定的,终点逐渐往下移,我们可以创建一个固定大小的窗口,起点和终点同时往下移动。只需要修改 UNBOUNDED 为一个固定的数字就可以了。我们修改成 2, 和 3 分别看一下
SELECT order_no, order_type, order_text, order_qty, SUM(order_qty) OVER (ORDER BY order_no ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS cumulative_qty2, SUM(order_qty) OVER (ORDER BY order_no ROWS BETWEEN 3
