`
vtyi
  • 浏览: 84358 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle function memo

阅读更多

分析函数 : 分析函数用于计算基于组的某种聚合值, 聚合函数对于每个组只返回一行。

row_number(),rank()和dense_rank()的区别是:

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).

  与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.

  row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).

  rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).

  dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .

  lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。

 

  CREATE TABLE TABLE1
   (    "NAME" VARCHAR2(40 BYTE),
    "CLASS" VARCHAR2(40 BYTE),
    "SCORE" NUMBER,
    "DATE" NUMBER
   )

select class, rank()over(partition by class order by score desc) a from table1;
select class,row_number()over(order by class/score asc) as bb from table1;

select class, sum(score)over(partition by class order by class desc) as  aa from table1;

 

下面通过几个例子来说明其应用。                                       
1:统计某商店的营业额。        
     date       sale
     1           20
     2           15
     3           14
     4           18
     5           30
    规则:按天统计:每天都统计前面几天的总额
    得到的结果:
    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                              
   
    通过:   
    --
    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()l是连续排序,有两个第二名时仍然跟着第三名
     
     
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)

 

 

分享到:
评论

相关推荐

    在memo中查找字符串

    function SearchMemo(Memo: TCustomEdit; const SearchString: string; Options: TFindOptions): Boolean; var Buffer, P: PChar; Size: Word; begin Result := False; if Length(SearchString) = 0 then ...

    Delphi 7.0 得到Memo中的可见行数.rar

     function LinesVisible(Memo: TMemo): integer;  Var  OldFont : HFont;  Hand : THandle;  TM : TTextMetric;  Rect : TRect;  tempint : integer;  begin  Hand := GetDC(Memo.Handle);  try  ...

    动态改变FastReport内的Memo内容

    function OnBeforePrint() { var memo = this.Memo1; memo.Text = "打印前的内容"; } ``` 6. **处理多语言**:如果你的应用需要支持多语言,FastReport提供了处理多语言文本的能力。你可以为每个Memo创建多...

    动态改变FastReport内的Memo内容 Delphi

    在某些情况下,我们需要在运行时动态地改变报表中的内容,例如更新Memo组件的文字。本文将深入探讨如何在Delphi中动态改变FastReport内的Memo内容。 首先,我们需要了解FastReport的基本工作原理。FastReport由多个...

    oracle大作业--网上订餐系统(基于oracle和C#实现)

    这是一份oracle的大作业实验报告,里面有源代码以及实验报告。实验报告有20页,包含了整个项目的需求分析,界面实现,核心代码,数据库设计,功能演示等方面。项目是以网上订餐系统为需求,C#为用户界面,Oracle为...

    Delphi7中Memo组件实现查找替换功能

    ### Delphi7中Memo组件实现查找替换功能 #### 一、引言 在软件开发过程中,文本处理是一项常见的需求,特别是在编写编辑器或文档管理工具时。Delphi作为一种高效的编程语言,提供了丰富的组件来帮助开发者快速构建...

    动态设置Memo控件边框的大小,Delphi代码..rar

    在Delphi编程环境中, Memo 控件是一个常用的组件,用于显示和编辑多行文本。它通常被用作日志记录、用户输入或者简单的文本编辑。在某些情况下,我们可能需要动态地调整 Memo 控件的边框大小,以适应界面设计的变化...

    delphi中memo实现高亮文字

    在Delphi编程环境中,Memo组件是一个非常常用的文本编辑控件,它允许用户输入和查看多行文本。在某些应用场景中,比如代码编辑器或者文本高亮显示,我们可能需要实现特定关键字的高亮功能。本篇文章将详细讲解如何在...

    MEMO控件

    MEMO控件MEMO控件

    Delphi Memo语法高亮

    在Delphi和C++Builder这样的集成开发环境中,Memo组件是常用的文本输入和显示控件。本文将深入探讨如何实现和自定义Memo组件的语法高亮。 1. **什么是语法高亮?** 语法高亮是指在编辑器中,根据代码的不同元素...

    delphi Memo字段过滤

    在编程领域,尤其是在数据库操作中,"Memo"字段通常用于存储大段的文本信息,比如长篇文章、备注或日志。在Delphi中,当我们处理包含Memo字段的数据时,可能会遇到需要过滤这些字段的情况,例如根据某些关键词或者...

    Oracle 临时表用法

    ### Oracle 临时表用法详解 #### 一、背景与问题描述 在处理数据库操作时,经常遇到因数据量庞大而导致处理效率降低的问题。例如,某个报表中心的存储过程执行速度过慢,其中一个原因是该过程涉及到一个中间表,...

    Bonatic Memo

    【标题】"Bonatic Memo" 是一款基于Visual Basic(VB)开发的应用程序,它扩展了系统内置记事本的功能,提供了更加丰富的文本编辑和管理体验。这款软件版本为"Bonatic Memo 2.0",意味着它至少经历了一次重大更新,...

    navicat _for_oracle_V11

    在“navicat for oracle memo.docx”文档中,通常会包含Navicat for Oracle V11的详细操作指南和使用技巧,例如如何配置连接参数、创建新的数据库对象、执行SQL语句、进行数据同步以及设置数据库提醒等。这些说明将...

    MyMemo

    【MyMemo】是一款个人记忆管理应用,旨在帮助用户高效地整理、存储和检索各种信息。在深入探讨MyMemo的功能和特点之前,我们首先需要理解它所代表的核心概念——信息管理和记忆辅助。 信息管理是现代生活中的关键...

    FastReport3.0 以后版本动态改变Memo实用例子

    在这个“FastReport3.0以后版本动态改变Memo实用例子”中,我们将深入探讨如何在FastReport的高级版本中动态地修改Memo控件的内容,这对于开发具有交互性和实时性的应用程序至关重要。 首先,让我们理解FastReport...

    动态改变FastReprot内Memo的内容

    本知识点主要探讨如何在运行时动态地更改FastReport中的Memo组件内容。 FastReport是一种可视化报表设计器,允许开发者创建复杂的报告布局,包括文本、图像、表格等元素。Memo组件在FastReport中用于显示多行文本,...

    Memo记事本 1.0.1.0

    《Memo记事本 1.0.1.0:打造高效便捷的文本管理工具》 在信息化时代,人们日常工作中需要处理的信息量日益庞大,如何有效地管理这些信息变得至关重要。 Memo 记事本 1.0.1.0 正是这样一款针对这一需求而设计的增强...

    Delphi给Memo组件的显示区域设置边距..rar

    在Delphi编程环境中, Memo组件是开发者常用的控件之一,用于显示和编辑多行文本。在实际应用中,我们有时需要对Memo组件的显示区域进行定制,比如设置边距,以便增强界面的美观性和用户体验。本篇文章将深入探讨...

Global site tag (gtag.js) - Google Analytics