Oracle over()函数使用说明

例1

 代码如下 复制代码

–select * from tmn_zhbg order by id desc

select id, mc,fs,class,sum (fs) over (order by fs,id) 连续累加,sum (fs) over (order by fs) 连续累加XX,sum (fs) over (partition by id ) 分组求和,
sum (fs) over (partition by id order by fs ) 分组id连续
from
(
select 1 id,’yw’ mc,50 fs,1 class from dual
union all
select 1 , ‘sx’ , 81,1 from dual
union all
select 1 , ‘yy’ , 20,1 from dual
union all
select 2 , ‘yw’ , 81,1 from dual
union all
select 2 , ‘sx’ , 32,1 from dual
union all
select 2 , ‘yy’ , 21,1 from dual
union all
select 4 , ‘yw’ , 10,1 from dual
union all
select 4 , ‘sx’ , 82,1 from dual
union all
select 4 , ‘yy’ , 20,1 from dual
) a

补充一个实例

表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 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
    规则:按天统计:每天都统计前面几天的总额
    得到的结果:
    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()l是连续排序,有两个第二名时仍然跟着第三名

时间: 2024-09-17 23:24:44

Oracle over()函数使用说明的相关文章

Oracle Decode()函数和CASE语句的比较

      Oracle Decode()函数和CASE语句都是我们经常用到的,那么它们的区别在哪里呢?下面就为您详细介绍             Oracle Decode()函数和CASE语句的区别,供您参考. 首先,举2个简单的例子,简单对比一下这2者的区别. 1.CASE语句: 以下是代码片段: SELECT CASE SIGN(5 - 5) WHEN 1 THEN 'Is Positive' WHEN -1 THEN 'Is Negative' ELSE 'Is Zero' END F

oracle中函数和存储过程简单示例-动态sql

oracle中函数和存储过程 1. 函数 create or replace function getArtCount(keyword in varchar2) return number as   Result number;    Sqlt varchar2(4000); begin    -- select t.sys_documentid into Result from dom_2_doclib t where t.sys_topic like '%key%';        -- s

Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace

Oracle使用正则表达式离不开这4个函数:1.regexp_like2.regexp_substr3.regexp_instr4.regexp_replace 看函数名称大概就能猜到有什么用了.regexp_like 只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配,语法很简单: regexp_substr 函数,和 substr 类似,用于拾取合符正则表达式描述的字符子串,语法如下: regexp_instr 函数,和 instr 类似,用于标定符合正则表达式的字符子串的

oracle自定义函数的问题,求助大神啊

问题描述 oracle自定义函数的问题,求助大神啊 在oracle中定义一个函数,用来实现从身份证号中提取出生日期并将提取结果保存到指定表中.提示:提前创建一个至少包含(身份证 varchar2,出生日期 date)的二维表 小白初学oracle,这个问题做了一下午还没弄明白,各路大神给指点一下啊 解决方案 oracle自定义函数oracle 自定义函数oracle 自定义函数入门 解决方案二: 例:表1, 身份证:xxxxxx20150810xxxx ,求出生日期update 表1 set 出

oracle自定义函数如何转成mysql函数

问题描述 oracle自定义函数如何转成mysql函数 这是oracle自定义的函数,怎么把他转成mysql的 create or replace function fun_return_zjxl(in_taskId varchar2, in_work_no varchar2) return varchar2 is v_sum number(10);--质检平均完成量 v_num NUMBER(10);--质检个人完成量 v_qualitied_cnt NUMBER(10); v_result

ORACLE 常用函数——聚合函数

/**************************************************************************************************************************                                        ORACLE 常用函数                                                 这个系列我将整理一些日常我们经常使用到的ORACLE函

oracle listagg函数查询出来显示空白

问题描述 oracle listagg函数查询出来显示空白 select listagg(**tr_mer_no** || tr_id, ' ') within group( order by tr_id desc) from ccps_traderecord where tr_mer_no = 140102 and tr_id < 20 select listagg(**tr_currency **|| tr_id, ' ') within group( order by tr_id desc

Oracle 常用函数

1.Oracle Least()函数 2.Oracle Greatest()函数 3.EXTRACT (datetime) 4.SUBSTR函数 5.

oracle 管道函数bug-oracle 管道函数返回行,通过ROWNUM提取前20行报错

问题描述 oracle 管道函数返回行,通过ROWNUM提取前20行报错 各位:使用如下语句:SELECT * FROM TABLE(FUN_TEST('工单')) where ROWNUM<=2;当SELECT * FROM TABLE(FUN_TEST('工单')) 返回的行数>=2时,报ORA-06548:不再需要更多的行错误,但不加ROWNUM条件时则一切正常.那位大神碰到了这种情况?给小弟指一条明路.