聚合函数
本课属于 Coddy SQL 学习旅程的“基础知识”单元。第 68 课,共 72 课。
使用 OVER (ORDER BY ...) 时,AVG() 或 MAX() 等聚合函数会对截至当前行的所有行进行计算,包括在 ORDER BY 值上与当前行并列的行。在 OVER 中不使用 ORDER BY 时,这些函数会对所有行进行计算,因此每一行得到的值都相同。
例如,我们可以计算截至每个期末的最高收入:
| 月份 | 收入 | 地区 |
| 4 | 40 | East |
| 5 | 20 | East |
| 6 | 60 | West |
| 7 | 55 | West |
| 8 | 61 | East |
SELECT month, revenue, MAX(revenue) OVER (ORDER BY month ASC) as max_revenue
from table1这会返回:
| 月份 | 收入 | max_revenue |
| 4 | 40 | 40 |
| 5 | 20 | 40 |
| 6 | 60 | 60 |
| 7 | 55 | 60 |
| 8 | 61 | 61 |
第 4 个月和第 5 个月的最高收入是 40,第 6 个月和第 7 个月是 60,第 8 个月是 61。这是因为找到更高的新收入时,它会舍弃旧收入,并使用目前为止的最高收入。
对于 AVG() 函数,写法如下:
SELECT month, revenue, AVG(revenue) OVER (ORDER BY month ASC) as avg_revenue
from table1| 月份 | 收入 | avg_revenue |
| 4 | 40 | 40 |
| 5 | 20 | 30 |
| 6 | 60 | 40 |
| 7 | 55 | 43.75 |
| 8 | 61 | 47.2 |
我们还可以使用 PARTITION BY 按特定类别对计算结果分组。例如:
SELECT month, revenue, region,
MAX(revenue) OVER (PARTITION BY region ORDER BY month ASC) as max_revenue
FROM table1会得到:
| 月份 | 收入 | 地区 | max_revenue |
| 4 | 40 | East | 40 |
| 5 | 20 | East | 40 |
| 6 | 60 | West | 60 |
| 7 | 55 | West | 60 |
| 8 | 61 | East | 61 |
现在会分别计算每个地区的最大值。东部地区和西部地区各自独立维护运行中的最大值。
挑战
简单可用的表和列:
books:book,page,words
对于每本书,显示书名、总页数、每页的字数,并计算:
- 这本书中任意一页的最大字数
- 整本书每页的平均字数
- 当前页的字数与这本书每页平均字数之间的差值
按书名和页码排序显示结果。
返回以下列:
bookpagewordsmax_words_in_bookavg_words_per_pagediff_from_avg
亲手试试
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: SQL 在线编辑器