使用LAG和LEAD函数统计

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

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

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

SQL> select year,region,profit ,lag (profit,1) over (order by year)

/PS$Oe0j9S0

 

L|\&LE+H0

 2      as last_year_exp from test;51Testing软件测试网 @`)u|)lpG-\3VP

 51Testing软件测试网EQ%A'^G%UP

YEAR REGION     PROFIT LAST_YEAR_EXP51Testing软件测试网8}Y-? D b

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

-tt9I?#I:eE KT1Q:?j0

2003 West           88

)T(AEHM.R.m}v5T3Px.?0

2003 West           88           88

hb!c!E)fK9C0

2003 Central       101           88

&RQ,nD'bo0

2003 Central       100          10151Testing软件测试网`!W&Uh4D:H0oo"IN

2003 East          102          10051Testing软件测试网,w^9l9u/{ h g"M9_C

2004 West           77          10251Testing软件测试网9D F&T"noHOc(T(Q6YT_

2004 East          103           7751Testing软件测试网d7tN$RK

2004 West           89          103

FQb7C3d[t0

 

&t Kfr!MXb y_0

SQL> select year,region,profit ,lead (profit,1) over (order by year)51Testing软件测试网 e*s"P1O [)S vO

 51Testing软件测试网#cMi4T3dBS$E

 2      as next_year_exp from test;

8O r3io"w%A_'j0

 51Testing软件测试网UF| hGsG1]

YEAR REGION     PROFIT NEXT_YEAR_EXP51Testing软件测试网8Dyp5K$D9~7|$})D:v C

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

`\M)Cs-a,I Jma0

2003 West           88           8851Testing软件测试网[c@Qd)iOmz

2003 West           88          10151Testing软件测试网0o(| V2M`.P GO

2003 Central       101          10051Testing软件测试网-V-{'x'j e&CV

2003 Central       100          102

(xm9@)Pw.\!E0

2003 East          102           77

5uIn4kUr0

2004 West           77          103

w:i Bv&Fx9hL(M3t0

2004 East          103           89

[!O9t$L|I.v{0

2004 West           89

o+Y&emmX8Gs{*o0

Lag函数为Lag(exp,N,defval)defval是当该函数无值可用的情况下返回的值。Lead函数的用法类似。51Testing软件测试网j _6Lb6J$f$F

LeadLag函数也可以使用分组,以下是使用region分组的例子:

'@$`ZSh%Z.v0

SQL> select year,region,profit ,

c6EA4To0m_Ef0

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

$M1[]'WW#W0

 

%w ya` H0

 3      as last_year_exp from test;51Testing软件测试网 kgCN;kT

 51Testing软件测试网c"R w6bz

YEAR REGION     PROFIT LAST_YEAR_EXP51Testing软件测试网u*DZSh2rV&R2`#|

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

O yj+T[jH$u z0

2003 Central       101            0

j'y|.fJ0

2003 Central       100          101

|7t+l sS0

2003 East          102            0

j!d+bt7KZ{!U5`,}hm0

2004 East          103          10251Testing软件测试网_ E.I2q\f!@j5sw

2003 West           88            051Testing软件测试网c}*_ PAp\

2003 West           88           88

&M?)Vr-j'`8E D0

2004 West           77           8851Testing软件测试网4C(}B'a)m'yY3H.\

2004 West           89           7751Testing软件测试网L&c"ada&]

 

:X!~9b{s3P0E0

一表stoptime,中有字段如下:op_time,stop_num   其中op_time为datetime型,stop_num为num型。  
S/O.t#ajcr0   51Testing软件测试网4S$GR_8w g
  现在我想把op_time字段中,超过30分钟的记录取出来。也就是说,我的程序是每分钟都要在stoptime表中插入记录,按照规定,如果超过30分钟没插入记录,就可能是程序出现异常,需要处理。所以,我想从表中取两条记录间时间间隔大于30分钟的。  
7C6{%y'lq0   
M,x ? S"NQ8^z6m0  另:表中的记录是不变的,也就是说,我统计的是前几天的记录,不是实时的记录。  
`i$s$?|O4yH!l:F2]#p0  有语句可实现么?实在不行,就只能通过中间表实现了。

7\1Y/it#V+e2B0

select   op_time,stop_num   from  
4|Z^mh0  (select   op_time,stop_num,   lead(op_time)   over(order   by   op_time)   a   from   stoptime)   b  
'P1LM,u%D(TU0  where   a-op_time>1/(24*2)
51Testing软件测试网.Auy*|v7g A$HkK

TAG: Oracle

 

评分:0

我来说两句

Open Toolbar