使用LAG和LEAD函数统计

上一篇 / 下一篇  2009-02-10 23:15:33 / 个人分类:Oracle

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP

LagLead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值。这种操作可以使用对相同表的表连接来实现,不过使用LAGLEAD有更高的效率。以下是LAGLEAD的例子:51Testing软件测试网)Gb*Ut9e D

SQL> select year,region,profit ,lag (profit,1) over (order by year)51Testing软件测试网)c"t:B:Hc){

 51Testing软件测试网W TZd SlmDx

 2      as last_year_exp from test;51Testing软件测试网/Z"\K8zjSZ b_

 51Testing软件测试网p X[#k)H;V ? \L

YEAR REGION     PROFIT LAST_YEAR_EXP

/T |N1hq`0

---- ------- ---------- -------------51Testing软件测试网3wkM \p C

2003 West           8851Testing软件测试网X+KXVHm

2003 West           88           8851Testing软件测试网'e~:Fi)JK7N5o

2003 Central       101           88

*I5p'ql@&n'\h6o0

2003 Central       100          101

RX4Spf0

2003 East          102          10051Testing软件测试网D6w9dl ?.\6|$C

2004 West           77          102

Wb.O{b@0

2004 East          103           77

aw0D]0t0

2004 West           89          10351Testing软件测试网K{M%co{

 

\&J$lIa*AM av0

SQL> select year,region,profit ,lead (profit,1) over (order by year)51Testing软件测试网,[m|-y\L0X

 51Testing软件测试网+O:W{ cg1b

 2      as next_year_exp from test;

nb!L!U&\0

 51Testing软件测试网djmu6}&U j5|

YEAR REGION     PROFIT NEXT_YEAR_EXP

"Xi H_8if CJA0

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

zL4^ f6|0

2003 West           88           88

}lcf e8z0

2003 West           88          10151Testing软件测试网@ Z6k-S\8`RW9`f

2003 Central       101          10051Testing软件测试网D#fX:eY;|4hw

2003 Central       100          10251Testing软件测试网o3Z D3Q&H,L!K3we3H

2003 East          102           77

8Wxn z u M7B0

2004 West           77          10351Testing软件测试网-O(jX6|vhU0Tb6d

2004 East          103           8951Testing软件测试网_9uh o _#G

2004 West           8951Testing软件测试网f/w+s1j2\,t

Lag函数为Lag(exp,N,defval)defval是当该函数无值可用的情况下返回的值。Lead函数的用法类似。

2jp ^^p @ A0

LeadLag函数也可以使用分组,以下是使用region分组的例子:51Testing软件测试网$^ VLl_A

SQL> select year,region,profit ,

%s6JS|9s&N w8Vg&s0

 2 lag (profit,1,0) over (PARTITION BY region order by year)

Qv.P9Od1a0

 

vF(An6S&k(\x0

 3      as last_year_exp from test;

`7@ Me[\Q|g0

 

?ro*i K0

YEAR REGION     PROFIT LAST_YEAR_EXP51Testing软件测试网 u$Gy:x ?/c@mF

---- ------- ---------- -------------51Testing软件测试网DU5T:LBk/W"^E Uj

2003 Central       101            0

0x'C*}E5fC)W0

2003 Central       100          10151Testing软件测试网 SV?1]"o#y t

2003 East          102            051Testing软件测试网;iL4LS7D~1C

2004 East          103          102

&Q2V&K-b"i!z0

2003 West           88            051Testing软件测试网 q,G~E1E

2003 West           88           88

vbV^B0

2004 West           77           88

g]S5b;H6~)j0

2004 West           89           7751Testing软件测试网XtQz.b6\6m

 51Testing软件测试网:OOWH!Eifn

一表stoptime,中有字段如下:op_time,stop_num   其中op_time为datetime型,stop_num为num型。  
9^+U/e.a/LO1g*O0   51Testing软件测试网eH9z5f(E
  现在我想把op_time字段中,超过30分钟的记录取出来。也就是说,我的程序是每分钟都要在stoptime表中插入记录,按照规定,如果超过30分钟没插入记录,就可能是程序出现异常,需要处理。所以,我想从表中取两条记录间时间间隔大于30分钟的。  51Testing软件测试网%I2R!Lk;LI$B
   
v'V4VjR4IT9u0  另:表中的记录是不变的,也就是说,我统计的是前几天的记录,不是实时的记录。  
z"P9u$U/yN'r&A/@0  有语句可实现么?实在不行,就只能通过中间表实现了。

%I/I zV#y`t'Ilq)s&GW0

select   op_time,stop_num   from  
2Pu[ZU PgvP1?2n}0  (select   op_time,stop_num,   lead(op_time)   over(order   by   op_time)   a   from   stoptime)   b  51Testing软件测试网1x#W+MD`0[*p&cX&F7J
  where   a-op_time>1/(24*2)

} v&R$vWL&c N0

TAG: Oracle

 

评分:0

我来说两句

Open Toolbar