`

oracle SQL特性使用

 
阅读更多
oracle分析函数
统计记录中类似1/222这样的记录
select rownum||'/'||count(1) over(partition by 1)  from user_tables

通过以上一个小例子,学习一下开窗函数,如下:
oracle的分析函数over 及开窗函数,网上有些不正确,本人修正了

eg:  相关解析:
表t_pi_part
字段  id  code   name
value 1  222     a
value 2  222     b
value 3 333     c
给code相同的part code 添加行标,根据id 排序

select p.* ,row_number()over(partition by p.code order by a.id desc) as row_index from t_pi_part p;

一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是
对于每个组返回多行,而聚合函数对于每个组只返回一行。
下面通过几个例子来说明其应用。                                      
1:统计某商店的营业额。       
     date       sale
     1           20
     2           15
     3           14
     4           18
     5           30
    规则:按天统计:每天都统计前面几天的总额
   select p.*,sum(sale) over (order by "date") from sale_test p;
   
    得到的结果:
    DATE   SALE       SUM
    ----- -------- ------
    1      20        20           --1天          
    2      15        35           --1天+2天          
    3      14        49           --1天+2天+3天          
    4      18        67            .         
    5      30        97            .
    
2:统计各班成绩第一名的同学信息
    NAME   CLASS S                        
    ----- ----- ----------------------
    fda    1      80                    
    ffd    1      78                    
    dss    1      95                    
    cfe    2      74                    
    gds    2      92                    
    gf     3      99                    
    ddd    3      99                    
    adf    3      45                    
    asdf   3      55                    
    3dd    3      78             
  
    通过:  
    --
    select * from                                                                      
    (                                                                           
    select name,class,s,rank()over(partition by class order by s desc) mm from t2
    )                                                                           
    where mm=1
    --
    得到结果:
    NAME   CLASS S                       MM                                                                                       
    ----- ----- ---------------------- ----------------------
    dss    1      95                      1                     
    gds    2      92                      1                     
    gf     3      99                      1                     
    ddd    3      99                      1         
  
    注意:
    1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果         
    2.rank()和dense_rank()的区别是:
      --rank()是跳跃排序,有两个第二名时接下来就是第四名
      --dense_rank()是连续排序,有两个第二名时仍然跟着第三名
    
    
3.分类统计 (并显示信息)
    A   B   C                     
    -- -- ----------------------
    m   a   2                     
    n   a   3                     
    m   a   2                     
    n   b   2                     
    n   b   1                     
    x   b   3                     
    x   b   2                     
    x   b   4                     
    h   b   3
   select a,c,sum(c)over(partition by a) from t2               
   得到结果:
   A   B   C        SUM(C)OVER(PARTITIONBYA)     
   -- -- ------- ------------------------
   h   b   3        3                       
   m   a   2        4                       
   m   a   2        4                       
   n   a   3        6                       
   n   b   2        6                       
   n   b   1        6                       
   x   b   3        9                       
   x   b   2        9                       
   x   b   4        9                       
 
   如果用sum,group by 则只能得到
   A   SUM(C)                           
   -- ----------------------
   h   3                     
   m   4                     
   n   6                     
   x   9                     
   无法得到B列值      
 
=====

select * from test

数据:
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6


---将B栏位值相同的对应的C 栏位值加总
select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum
from test

A B C C_SUM
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6



---如果不需要已某个栏位的值分割,那就要用 null

eg: 就是将C的栏位值summary 放在每行后面

select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
from test

A B C C_SUM
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17

求个人工资占部门工资的百分比

SQL> select * from salary;

NAME DEPT SAL
---------- ---- -----
a 10 2000
b 10 3000
c 10 5000
d 20 4000

SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;

NAME DEPT SAL PERCENT
---------- ---- ----- ----------
a 10 2000 20
b 10 3000 30
c 10 5000 50
d 20 4000 100
二:开窗函数          
      开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:    
   over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
   over(partition by deptno)按照部门分区
2:
  over(order by salary range between 5 preceding and 5 following)
   每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5
   例如:对于以下列
     aa
     1
     2
     2
     2
     3
     4
     5
     6
     7
     9
  
   sum(aa)over(order by aa range between 2 preceding and 2 following)
   得出的结果是
            AA                       SUM
            ---------------------- -------------------------------------------------------
            1                       10                                                     
            2                       14                                                     
            2                       14                                                     
            2                       14                                                     
            3                       18                                                     
            4                       18                                                     
            5                       22                                                     
            6                       18                                                               
            7                       22                                                               
            9                       9                                                                
            
   就是说,对于aa=5的一行 ,sum为   5-1<=aa<=5+2 的和
   对于aa=2来说 ,sum=1+2+2+2+3+4=14     ;
   又如 对于aa=9 ,9-1<=aa<=9+2 只有9一个数,所以sum=9    ;
             
3:其它:
     over(order by salary rows between 2 preceding and 4 following)
          每行对应的数据窗口是之前2行,之后4行
4:下面三条语句等效:          
     over(order by salary rows between unbounded preceding and unbounded following)
          每行对应的数据窗口是从第一行到最后一行,等效:
     over(order by salary range between unbounded preceding and unbounded following)
           等效
     over(partition by null)
分享到:
评论

相关推荐

    Oracle Sql语句转换成Mysql Sql语句

    在使用这个工具时,开发者需要确保源代码中的SQL语句是标准的Oracle SQL格式,避免使用特定Oracle数据库的特性,以提高转换的成功率。同时,转换后还需要对生成的MySQL SQL进行测试,确保在目标数据库环境中能正常...

    Oracle SQL高级编程

    2. 高级查询技术:使用Oracle SQL的高级特性,如分析函数、子查询、连接以及数据聚合等。 3. 事务处理:深入理解如何使用Oracle的事务控制语句,如COMMIT、ROLLBACK以及SAVEPOINT,进行有效的事务管理。 4. 锁机制:...

    Oracle Sql基础(beginning oracle sql中文版)

    PL/SQL是Oracle的编程语言,结合了SQL和过程编程特性。它允许编写存储过程、函数、触发器和包,增强了数据库应用程序的功能和性能。 十、索引 索引可以显著提高数据检索的速度。Oracle支持B树索引、位图索引、函数...

    Oracle SQL 官方文档

    Oracle SQL 是一种强大的数据库查询和编程语言,广泛用于管理和操作Oracle数据库系统。11g第二版(11G2)是Oracle的一个重要版本,提供了许多增强功能和优化。本官方文档集包括四份重要的参考资料,涵盖了Oracle SQL...

    Oracle的SQL监视工具SQLTracker

    Oracle的SQL监视工具SQLTracker是一款强大的性能分析工具,专为数据库管理员和开发人员设计,用于诊断和优化SQL查询性能。这款工具在Oracle数据库环境中扮演着重要角色,它可以帮助用户实时监控SQL语句的执行情况,...

    《精通Oracle SQL 第2版》PDF版本下载.txt

    3. **函数与表达式**: 介绍了Oracle SQL中的内置函数和表达式的使用方法。 4. **数据控制**: 讲解了如何使用GRANT和REVOKE语句来控制对数据库对象的访问权限。 5. **索引与优化**: 分析了索引的工作原理及其在提高...

    精通Oracle_SQL(第2版)含源码

    3. **高级SQL特性**:书中涵盖了Oracle特有的SQL功能,如PL/SQL过程化语言,游标,递归查询,窗口函数,分析函数,以及在SQL中使用正则表达式等,这些高级特性为复杂的数据处理提供了强大支持。 4. **性能调优**:...

    精通OracleSQL第2版.zip

    本书的第二版可能涵盖了新的特性和改进,以适应Oracle数据库不断发展的变化。 在深入学习这本书的过程中,读者可以期待以下几个关键知识点的讲解: 1. **SQL基础**:书中会详细阐述SQL的基本语法,如SELECT语句的...

    oracle SQL语法大全

    本资料“Oracle SQL语法大全”将全面涵盖Oracle SQL的基础概念、语法结构以及高级特性。 一、SQL基础 SQL的基本组成部分包括SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)和DDL(数据定义语言)...

    Oracle SQL(SQL for Oracle)

    这本书“Oracle SQL(SQL for Oracle)”显然是为了帮助读者深入理解和掌握在Oracle环境中有效使用SQL。 在Oracle SQL中,有以下几个关键知识点: 1. **数据类型**:Oracle支持多种数据类型,包括数值型(如NUMBER...

    Pro Oracle SQL (2010)

    - **支持特性**:Oracle 提供了一系列高级特性来支持 SQL 的有效使用,比如分区、索引、视图等。 - **集合思维**:Oracle SQL 强调的是集合操作而非行操作,即一次性处理多行记录而不是单行记录。 ##### 3. Oracle ...

    pro oracle sql pdf

    综上,文件提供的信息主要涵盖了关于“Pro Oracle SQL”这本书的出版细节、版权信息和内容摘要,通过这些信息我们可以推断出该书将为读者提供深入的Oracle SQL知识,并针对Oracle数据库的特定特性进行详细讲解。

    Oracle SQL Developer Data Modeler实体关系图ERD绘制详解

    本文详尽介绍了使用Oracle SQL Developer Data Modeler进行实体关系图ERD绘制的方法及其功能特性。主要包括Data Modeler的基本介绍、ERD的设计步骤、规范化数据库设计的方法、ERD的编辑优化技巧及导出和分享数据模型...

    oracle sql 大全(三个文档)

    "oracle1.pdf"可能更侧重于Oracle SQL的高级特性,比如索引、触发器、存储过程、函数、视图、游标、事务管理和并发控制。这些内容对于数据库管理员和开发人员来说至关重要,因为它们涉及到数据库性能优化、数据安全...

    Mastering Oracle SQL(2th)

    本书涵盖了Oracle SQL在Oracle 10g版本中的新特性和改进,包括更高效的数据处理方法、增强的安全性功能以及对大数据量的支持。通过详细的案例分析和示例,读者可以了解到如何在实际场景中应用这些新特性,提高数据库...

    oracle sql 高级编程

    窗口函数是Oracle SQL的一个强大特性,它们允许在结果集的行之间进行计算,而无需创建临时表或使用自连接。例如,RANK()、ROW_NUMBER()、DENSE_RANK()和LEAD/LAG函数可以帮助处理排名、行间差异和预览/滞后值等任务...

    《精通Oracle SQL 第2版》 PDF

    书中主要介绍了如何掌握在Oracle数据库中实现的强大SQL特性,所涵盖的内容涉及SQL核心、SQL执行、分析函数、联结、测试与质量保证等,并提供了大量实用的建议,总结出方方面面的“技巧”,帮助读者快速消化重要知识...

    ORACLE SQL官方教程

    通过本教程,读者将不仅了解SQL的基本语法,还能深入理解Oracle SQL的高级特性,提升数据库管理与开发技能。对于数据库管理员、开发人员或任何需要处理Oracle数据库的人来说,这是一份宝贵的参考资料。

    ORACLE SQL入门与实战经典

    4. 使用PL/SQL:PL/SQL是Oracle提供的过程化语言,用于编写复杂的数据库逻辑。熟悉PL/SQL是编写高效存储过程、触发器和函数的关键。 5. 测试和调试:编写SQL后,测试是保证其正确性和效率的重要步骤。同时,了解...

    oraclesql 学习资料

    Oracle SQL 还提供了一些高级特性,使开发者能够更高效地管理和处理数据。 - **子查询**:可以在一个查询语句中嵌套另一个查询语句,以实现复杂的数据检索。 - 示例:`SELECT * FROM customers WHERE id IN (SELECT...

Global site tag (gtag.js) - Google Analytics