前两天改别人写的一个巨长的SQL,抽丝剥茧了半天,才找到需要修改的地方,但是看到了他用了一个比较少见(至少我没用过)的函数sum()over(),赶紧百度了下,真是孤陋寡闻了,看来基础还是要打打牢滴。
简单来说,这是一个开窗函数,按照分组和排序进行逐行累加:
sum():里面放需要求和的字段
over():里面放分组的字段,和排序的字段
具体用法:
sum(求和字段)over(PARTITION by 分组字段1,分组字段2…… order by 排序字段1……)
具体来说,那就举个例子吧,比如我们有一个表:
product | yearId | monthId | saleNum |
苹果 | 2025 | 1 | 10 |
苹果 | 2025 | 2 | 11 |
苹果 | 2025 | 3 | 12 |
香蕉 | 2025 | 1 | 20 |
香蕉 | 2025 | 2 | 21 |
香蕉 | 2025 | 3 | 22 |
使用下面的查询语句:
SELECT product,
yearId,
monthId,
saleNum,
sum(salesNum)over(PARTITION by product,yearId ORDER BY monthId) saleSum
FROM table
就会得到如下结果:
product | yearId | monthId | saleNum | saleSum |
苹果 | 2025 | 1 | 10 | 10 |
苹果 | 2025 | 2 | 11 | 21 |
苹果 | 2025 | 3 | 12 | 33 |
香蕉 | 2025 | 1 | 20 | 20 |
香蕉 | 2025 | 2 | 21 | 41 |
香蕉 | 2025 | 3 | 22 | 63 |
也就是说,根据product和yearId进行分组,然后再按照monthId进行排序,最后将saleNum值依次按月累计求和。
这只是一种场景,其实还可以用在财务类的场景,比如有个期初值,其他行是每月的发生值,然后依次按月累计,就能得出每月的期末值等。