oracle over的用法

sql over的作用及用法
RANK() OVER ( [query_partition_clause] order_by_clause )
DENSE_RANK () OVER ( [query_partition_clause] order_by_clause )
可实现按指定的字段分组排序,对于相同分组字段的结果集进行排序,
其中PARTITION BY 为分组字段,ORDER BY 指定排序字段

over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
其参数:over(partition by columnname1 order by columnname2)
含义:按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。
例如:employees表中,有两个部门的记录:department_id =10和20
select department_id,rank() over(partition by department_id order by salary) from employees就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。如果是partition by org_id,则是在整个公司内进行排名。


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

wm_concat(column)实现字段合并

通过一个例子解释

SELECT a.datum_class_id,
       wm_concat(a.metatb_id) over(partition by a.datum_class_id order by a.metatb_id rows between unbounded preceding and unbounded following)
  FROM datum_class_metatb a;

查询结果是:

1 10 12171,12172
2 10 12171,12172
3 11 12182,12187
4 11 12182,12187
5 12 62,12170,12171
6 12 62,12170,12171
7 12 62,12170,12171


说明:wm_concat是将metatb_id合并展示,

partition by a.datum_class_id  是按照datum_class_id进行分组排列,相同datum_class_id的才会合并

rows between unbounded preceding and unbounded following 这个是将同一组的所有数据都合并


### Oracle 中 WITH 子句的用法 Oracle 中的 `WITH` 子句(也称为 Common Table Expressions, CTE)允许用户定义一个临时的结果集,该结果集可以在查询中多次引用。它主要用于简化复杂查询、提高可读性以及优化性能。以下是 `WITH` 子句的基本语法和示例: #### 语法 ```sql WITH cte_name AS ( SELECT column1, column2, ... FROM table_name WHERE condition ) SELECT column1, column2, ... FROM cte_name WHERE condition; ``` #### 示例 以下是一个使用 `WITH` 子句的示例,用于计算每个部门的平均薪资,并筛选出高于平均薪资的员工: ```sql WITH dept_avg_salary AS ( SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id ) SELECT e.employee_id, e.first_name, e.last_name, e.salary, d.avg_salary FROM employees e JOIN dept_avg_salary d ON e.department_id = d.department_id WHERE e.salary > d.avg_salary; ``` 上述代码中,`WITH` 子句创建了一个名为 `dept_avg_salary` 的临时表,该表存储了每个部门的平均薪资[^4]。 --- ### 替代 SQL Server 中 `NEWID()` 函数的方法 在 Oracle 数据库中,`NEWID()` 函数并不被支持。如果需要生成唯一标识符,可以使用 `SYS_GUID()` 函数。以下是替代方案的详细说明: #### 使用 `SYS_GUID()` 函数 `SYS_GUID()` 是 Oracle 提供的一个函数,用于生成全局唯一标识符(GUID)。其返回值为 16 字节的 RAW 类型数据。可以通过以下方式将其转换为字符串形式: ```sql SELECT TO_CHAR(SYS_GUID(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') AS guid_string FROM dual; ``` 此查询将生成一个唯一的字符串标识符[^5]。 #### 替换原始查询中的 `NEWID()` 函数 根据用户提供的查询,可以将 `NEWID()` 替换为 `SYS_GUID()`,并调整语法以适应 Oracle 环境。以下是修正后的查询: ```sql WITH FilteredBRCIU AS ( SELECT brciu.CONFIRMATION_NUMBER, brciu.INVOICE_NUMBER, brciu.APPLICATION_NO, brciu.BLUE_NUMBER, ROW_NUMBER() OVER (PARTITION BY brciu.CONFIRMATION_NUMBER ORDER BY SYS_GUID()) AS rn FROM BBA_RED_CONFIRM_ISSUED_UNMATCH brciu WHERE EXISTS ( SELECT 1 FROM BBA_RED_CONFIRM_ISSUED_UNMATCH sub_brciu WHERE sub_brciu.CONFIRMATION_NUMBER = brciu.CONFIRMATION_NUMBER GROUP BY sub_brciu.CONFIRMATION_NUMBER HAVING COUNT(sub_brciu.CONFIRMATION_NUMBER) > 100 ) ), RandomBRCIU AS ( SELECT CONFIRMATION_NUMBER, INVOICE_NUMBER, APPLICATION_NO, BLUE_NUMBER FROM FilteredBRCIU WHERE rn = 1 ) UPDATE BBA_RED_CONFIRM_ISSUED_LAUNCH brcil SET brcil.confirm_number = rbrciu.CONFIRMATION_NUMBER FROM BBA_RED_CONFIRM_ISSUED_LAUNCH brcil INNER JOIN RandomBRCIU rbrciu ON brcil.INVOICE_NUMBER = rbrciu.INVOICE_NUMBER AND brcil.APPLICATION_NO = rbrciu.APPLICATION_NO AND brcil.BLUE_NUMBER = rbrciu.BLUE_NUMBER; ``` 在上述查询中,`NEWID()` 已被替换为 `SYS_GUID()`,并且保留了原有的逻辑结构[^6]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值