oracle中的over(partition by )的用法总结

本文详细介绍了SQL中的窗口函数使用方法,包括如何利用count(*)over进行分组计数以及row_number()over进行行号排序,帮助读者更好地理解这些函数在复杂查询中的应用。
 with tab as
     (
     select t.link_pid,
             t.mesh,
             round(x, 8) x,
             round(y, 8) y,
             round(z, 8) z,
             id
        from had_link t, table(sdo_util.getvertices(t.geometry)) g
        
        ),
    tab1 as
     (select t.link_pid,
             t.mesh,
             t.x,
             t.y,
             t.z,
             t.id,
             count(*) over(partition by t.link_pid, t.x, t.y, t.z) num,
             row_number() over(partition by t.link_pid, t.x, t.y, t.z order by t.id) sq
        from tab t

在这个代码中,count(*) over (partition by t.link_pid,t.x,t.y,t.z) num的意思是以t.link_pid, t.x, t.y, t.z这4个字段进行分组,统计分组后这四个字段相同的个数。类似还有count(*) over(order by ……)、sum(amount) over(partition by ……)等,

而在row_number() over...中,记录的是以t.link_pid, t.x, t.y, t.z分组后每条数据显示的行号,以t.id进行排序。

### OraclePARTITION BY用法Oracle 数据库中,`PARTITION BY` 子句主要用于配合窗口函数(分析函数),用于将结果集划分为多个逻辑分区,并针对每个分区内独立地应用特定的计算[^1]。这种功能特别适合于处理大规模数据集中的复杂聚合需求。 #### 基本语法 以下是 `PARTITION BY` 结合窗口函数的基本语法: ```sql <window_function>(expression) OVER ( PARTITION BY column_name_1 [, column_name_2, ...] [ORDER BY sort_expression [ASC|DESC]] [frame_clause] ) ``` - **`<window_function>`**: 表示具体的窗口函数名称,例如 `SUM`, `AVG`, `COUNT`, `ROW_NUMBER()` 等。 - **`PARTITION BY`**: 定义如何划分数据集为不同的逻辑分区。 - **`ORDER BY` (可选)**: 如果需要定义窗口内的顺序,则可以通过此选项指定排序依据。 - **`frame_clause` (可选)**: 可进一步控制窗口范围,例如当前行前后的记录数。 --- #### 示例 1: 使用 `PARTITION BY` 和 `SUM()` 假设有一个表 `sales` 记录了不同部门员工的销售额,结构如下: | employee_id | department | sales | |-------------|------------|-------| | 1 | HR | 500 | | 2 | IT | 800 | | 3 | HR | 700 | | 4 | IT | 600 | 如果希望按部门统计每位员工所在部门的总销售金额,可以使用以下 SQL 查询: ```sql SELECT employee_id, department, sales, SUM(sales) OVER (PARTITION BY department) AS total_sales_per_department FROM sales; ``` **结果**: | employee_id | department | sales | total_sales_per_department | |-------------|------------|-------|----------------------------| | 1 | HR | 500 | 1200 | | 3 | HR | 700 | 1200 | | 2 | IT | 800 | 1400 | | 4 | IT | 600 | 1400 | 在此查询中,`PARTITION BY department` 将数据按照 `department` 列进行了分割,在每个分区内分别计算了该部门所有成员的销售总额[^1]。 --- #### 示例 2: 配合 `ORDER BY` 进行动态累计求和 继续以上述 `sales` 表为例,如果我们想查看各部门内部每名员工的累积销售额,可以在 `OVER` 子句中加入 `ORDER BY` 来实现动态累加效果: ```sql SELECT employee_id, department, sales, SUM(sales) OVER (PARTITION BY department ORDER BY employee_id) AS cumulative_sales FROM sales; ``` **结果**: | employee_id | department | sales | cumulative_sales | |-------------|------------|-------|------------------| | 1 | HR | 500 | 500 | | 3 | HR | 700 | 1200 | | 2 | IT | 800 | 800 | | 4 | IT | 600 | 1400 | 这里通过 `PARTITION BY department` 对数据进行分组,并利用 `ORDER BY employee_id` 实现了基于员工 ID 排序的累积求和操作[^2]。 --- #### 示例 3: 使用 `RANK()` 函数排名 除了数值型汇总外,还可以借助其他类型的窗口函数完成更复杂的业务场景。比如下面的例子展示了如何根据销售额对同一部门下的员工进行排名: ```sql SELECT employee_id, department, sales, RANK() OVER (PARTITION BY department ORDER BY sales DESC) AS rank_within_dept FROM sales; ``` **结果**: | employee_id | department | sales | rank_within_dept | |-------------|------------|-------|------------------| | 3 | HR | 700 | 1 | | 1 | HR | 500 | 2 | | 2 | IT | 800 | 1 | | 4 | IT | 600 | 2 | 在这个案例里,我们不仅实现了跨部门的数据隔离,还完成了部门内个体之间的相对比较[^1]。 --- ### 总结 综上所述,`PARTITION BY` 是一种强大的工具,能够显著提升数据分析效率并简化某些传统方法难以解决的问题。它支持多种常见的窗口函数组合形式,适用于各种实际应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值