开源项目SDK:https://github.com/mingyang66/spring-parent
个人文档:https://mingyang66.github.io/raccoon-docs/#/
一、Mysql窗口函数over(partition by …)分组
Mysql8.0及更高版本支持窗口函数,这使得在查询结果集上执行计算变得更为简单,尤其在进行分组统计是。
以下是一个fund表,按照日期进行分组,并统计每个分组总的销售金额:
selecth.date,h.balance,sum(h.balance) over(partition by h.date) as balance,count(h.balance) over(partition by h.date) as amount
fromfund h
whereh.market_type = 'l'
order byh.date desc
- sum(…)是一个聚合函数,用于计算总的销售金额;
- count(…)是一个聚合函数,用于计算对应分组数量;
- over(partition by …)指定了窗口函数的分区方式,上述示例按照date进行分区,这意味着每天的销售金额都会被单独计算,每天的销售数量将会被单独计算;
执行上述查询后将会得到一个结果集,其中每一行都包含原始销售额,以及当天对应的总的销售额、销售数量。窗口函数不会减少结果集中的行数,而是会为每一行添加额外的计算列。
row_number() 是mysql8.0新增的函数,为查询结果中的每一行分配唯一的数字,遇到分组或排序的值相同时不会跳过序号,也不会分配相同的数字:
select row_number() over(partition by h.date order by h.date desc) as num from fund
上述指定了按照date分组,会在每个分组中按照date降序排列序号从1开始标记
select row_number() over(h.date order by h.date desc) as num from fund
上述sql未指定partition by分组,则会将整个sql按照条件date进行降序排列,并标记数字序号。
rank()是mysql8.0新增的函数,为查询结果中的每一行分配一个排名,如果遇到相同的排序字段值则会分配相同的排名,下一个对应的值会跳过上一个值对应的数量排名值。
select rank() over(order by h.init_date desc) as rk from fund
二、Mysql group by语句分组
group by语句根据一个或多个列对结果集进行分组,在分组列我们可以使用count、sum、avg等函数。
语法如下:
SELECT customer_id, SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer;
group by语句会减少结果的行数