在Oracle数据库中,使用窗口函数(也称为分析函数)可以在每个分组内部对数据进行统计,而无需改变原始数据集的行数。窗口函数允许你在查询的每一行上执行计算,这些计算可以基于当前行的值、其他行的值或整个分组的聚合值。
以下是一些使用窗口函数进行分组查询统计的常见示例:
- 计算每个分组的累计总和:
假设你有一个销售表(sales
),并且你想要知道每个产品的累计销售额。
sql复制代码
SELECT | |
product_id, | |
sale_date, | |
sale_amount, | |
SUM(sale_amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS cumulative_sales | |
FROM | |
sales; |
- 计算每个分组的排名:
使用RANK()
或DENSE_RANK()
函数,你可以为每个分组内的行分配一个排名。
sql复制代码
SELECT | |
product_id, | |
sale_date, | |
sale_amount, | |
RANK() OVER (PARTITION BY product_id ORDER BY sale_amount DESC) AS sales_rank | |
FROM | |
sales; |
- 计算每个分组的百分比:
如果你想要知道每个销售额占其产品总销售额的百分比,你可以使用SUM()
窗口函数来计算总销售额,并在外部查询中计算百分比。
sql复制代码
SELECT | |
product_id, | |
sale_date, | |
sale_amount, | |
sale_amount / SUM(sale_amount) OVER (PARTITION BY product_id) * 100 AS sales_percentage | |
FROM | |
sales; |
注意:在上面的百分比计算中,如果SUM(sale_amount)
为0,则会导致除以零的错误。你可能需要添加一个CASE语句来处理这种情况。
4. 计算每个分组的行号:
使用ROW_NUMBER()
函数,你可以为每个分组内的行分配一个唯一的行号。
sql复制代码
SELECT | |
product_id, | |
sale_date, | |
sale_amount, | |
ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY sale_date) AS sale_row_number | |
FROM | |
sales; |
- 计算每个分组的数量:
虽然这不是直接使用窗口函数来得到每个分组的数量(因为这通常是通过GROUP BY
和COUNT()
得到的),但你可以使用COUNT()
窗口函数在结果集中的每一行都显示这个数量。
sql复制代码
SELECT | |
product_id, | |
sale_date, | |
sale_amount, | |
COUNT(*) OVER (PARTITION BY product_id) AS sales_count_per_product | |
FROM | |
sales; |
这些只是窗口函数的一些基本用法。Oracle提供了许多其他窗口函数和选项,允许你执行复杂的分析和计算。