开窗函数 over() 累计统计用法

本文介绍了两种使用SQL进行累计统计的方法:一种是在遇到重复行时不累加;另一种是即使遇到重复行也进行累加。通过具体SQL语句示例,帮助读者理解如何根据不同需求选择合适的累计统计方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、累计统计,遇到重复行时不累加

sum(count(*)) over(order by count(*) desc ) 

2、累计统计,遇到重复行时也累加

sum(count(*)) over(order by count(*) desc rows between UNBOUNDED PRECEDING and current row ) 

### Oracle SQL窗口函数 `OVER()` 的语法和使用示例 #### 语法说明 `OVER()` 子句用于定义如何划分数据以及计算聚合或排名等功能。基本语法如下: ```sql function_name (argument) OVER ( [PARTITION BY partition_expression] [ORDER BY sort_specification] [windowing_clause] ) ``` - **PARTITION BY**: 将查询结果集划分为多个分区,类似于 `GROUP BY`,但在同一行上可以有多个不同的分组。 - **ORDER BY**: 定义每一部分内的逻辑顺序,这对于某些分析功能至关重要,例如累积总和或移动平均线。 - **windowing_clause**: 可选参数,指定窗口框架边界。 #### 使用示例 下面是一个简单的例子来展示如何利用 `ROW_NUMBER()`, `RANK()`, 和 `DENSE_RANK()` 函数配合 `OVER()` 来处理销售记录表中的数据[^1]。 假设有一个名为 `sales` 的表格,其中包含销售人员的名字 (`name`)、销售额 (`amount`) 和日期 (`sale_date`) 列,则可以通过以下方式获取每个月每名员工的累计销售额并对其进行排名: ```sql SELECT name, TO_CHAR(sale_date,'YYYY-MM') AS month, SUM(amount) OVER(PARTITION BY name, TO_CHAR(sale_date,'YYYY-MM')) AS monthly_total_sales, ROW_NUMBER() OVER(PARTITION BY TO_CHAR(sale_date,'YYYY-MM') ORDER BY SUM(amount) DESC) AS row_num, RANK() OVER(PARTITION BY TO_CHAR(sale_date,'YYYY-MM') ORDER BY SUM(amount) DESC) AS rank_val, DENSE_RANK() OVER(PARTITION BY TO_CHAR(sale_date,'YYYY-MM') ORDER BY SUM(amount) DESC) AS dense_rank_val FROM sales; ``` 这段代码会返回每位员工每月的总销量,并按照金额降序排列给出相应的行号(`row_num`)、等级(`rank_val`)及密集等级(`dense_rank_val`)。 对于更复杂的场景,比如想要获得过去三个月内每个客户的购买趋势,可以这样写: ```sql WITH customer_purchases AS( SELECT c.customer_id, p.purchase_amount, LAG(purchase_amount, 1) OVER w AS prev_month_purchase, LAG(purchase_amount, 2) OVER w AS two_months_ago_purchase, purchase_date FROM purchases p JOIN customers c ON p.cust_id = c.customer_id WINDOW w AS (PARTITION BY c.customer_id ORDER BY p.purchase_date)) SELECT * FROM customer_purchases WHERE purchase_date >= ADD_MONTHS(CURRENT_DATE,-3); ``` 这里通过自定义窗口 `w` 并应用 `LAG()` 函数实现了对前几个月度消费情况的访问[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值