SQL 如何使用SUM() OVER()函数

SQL 如何使用SUM() OVER()函数

在本文中,我们将介绍如何使用SQL中的SUM() OVER()函数。SUM() OVER()是一种在查询结果中计算累计总和的函数。它可以根据指定的窗口范围计算每一行的累计总和,而不仅仅是单独的每一行。

阅读更多:SQL 教程

SUM() OVER() 函数的语法

SUM() OVER() 函数的基本语法如下:

SUM(column) OVER (PARTITION BY expression [ORDER BY expression] [ROWS clause])
SQL

其中,column是需要计算累计总和的列名,expression是用于分区和排序的表达式,ROWS clause是用于指定窗口范围的子句。

使用 SUM() OVER() 计算累计总和

首先,我们来看一个简单的示例,假设有一个 sales 表,包含了销售记录的信息。

表结构如下:

sales
+--------+-------+
| amount | month |
+--------+-------+
|   100  |   1   |
|   200  |   1   |
|   150  |   2   |
|   300  |   2   |
|   250  |   3   |
|   350  |   3   |
+--------+-------+
SQL

我们想要计算每个月份的销售总额以及累计销售总额。

可以使用如下SQL语句实现:

SELECT 
  month,
  amount,
  SUM(amount) OVER (ORDER BY month) AS cumulative_total
FROM
  sales;
SQL

执行上述查询语句后,将会得到以下结果:

+-------+--------+-----------------+
| month | amount | cumulative_total|
+-------+--------+-----------------+
|   1   |   100  |       100       |
|   1   |   200  |       300       |
|   2   |   150  |       450       |
|   2   |   300  |       750       |
|   3   |   250  |       1000      |
|   3   |   350  |       1350      |
+-------+--------+-----------------+
SQL

从结果中可以看出,cumulative_total 列显示了每行之前所有月份的销售额的累计总和。

使用 PARTITION BY 子句分区计算

除了按照指定的排序方式计算累计总和外,我们还可以使用 PARTITION BY 子句将数据分区,然后计算每个分区的累计总和。

继续以 sales 表为例,假设我们想要按照月份分区计算每个月份内产品的累计销售总额。

可以使用如下SQL语句实现:

SELECT 
  month,
  amount,
  SUM(amount) OVER (PARTITION BY month ORDER BY month) AS cumulative_total
FROM
  sales;
SQL

执行上述查询语句后,将会得到以下结果:

+-------+--------+-----------------+
| month | amount | cumulative_total|
+-------+--------+-----------------+
|   1   |   100  |       100       |
|   1   |   200  |       300       |
|   2   |   150  |       150       |
|   2   |   300  |       450       |
|   3   |   250  |       250       |
|   3   |   350  |       600       |
+-------+--------+-----------------+
SQL

从结果中可以看出,cumulative_total 列显示了每个月份内每行之前产品的销售额的累计总和。

使用 ROWS 子句指定窗口范围

除了按照默认的窗口范围计算累计总和外,我们还可以使用 ROWS 子句来指定窗口的起始行和终止行,从而自定义窗口范围。

继续以上述示例为例,假设我们想要计算每个月份的前两行数据的累计销售总额,可以使用如下SQL语句实现:

SELECT 
  month,
  amount,
  SUM(amount) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS cumulative_total
FROM
  sales;
SQL

执行上述查询语句后,将会得到以下结果:

+-------+--------+-----------------+
| month | amount | cumulative_total|
+-------+--------+-----------------+
|   1   |   100  |       NULL      |
|   1   |   200  |       100       |
|   2   |   150  |       300       |
|   2   |   300  |       350       |
|   3   |   250  |       450       |
|   3   |   350  |       550       |
+-------+--------+-----------------+
SQL

从结果中可以看出,cumulative_total 列显示了每个月份的前两行数据的销售额的累计总和,并且窗口范围是自定义的。

总结

本文介绍了如何使用SQL中的SUM() OVER()函数进行累计总和的计算。通过使用SUM() OVER()函数,我们可以轻松地计算每行的累计总和,从而实现更复杂的查询需求。我们还可以使用PARTITION BY子句对数据进行分区计算,使用ORDER BY子句指定排序方式,使用ROWS子句指定窗口范围,以满足不同的业务需求。在实际应用中,我们可以根据具体的情况灵活运用SUM() OVER()函数,来实现更多种类的累计总和计算。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册