Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值。这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率。以下是LAG和LEAD的例子: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"\K8zjS Zb_
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'\h6o02003 Central 100 101
R X4Spf02003 East 102 10051Testing软件测试网D6w9dl
?.\6|$C
2004 West 77 102
Wb.O{b@02004 East 103 77
aw0D]0t02004 West 89 10351Testing软件测试网K{M%co {
\&J$lIa*AMav0SQL> 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
"X iH_8if
CJA0---- ------- ---------- -------------
zL4^f6|02003 West 88 88
}lcfe8z02003 West 88 10151Testing软件测试网@ Z6k-S\8`RW9`f
2003 Central 101 10051Testing软件测试网D#fX:eY;|4hw
2003 Central 100 10251Testing软件测试网o3ZD3Q&H,L!K3we3H
2003 East 102 77
8Wxnz
u
M7B02004 West 77 10351Testing软件测试网-O(jX6|vhU0Tb6d
2004 East 103 8951Testing软件测试网_9uho_#G
2004 West 8951Testing软件测试网f/w+s1j2\,t
Lag函数为Lag(exp,N,defval),defval是当该函数无值可用的情况下返回的值。Lead函数的用法类似。
2jp ^^p @ A0Lead和Lag函数也可以使用分组,以下是使用region分组的例子:51Testing软件测试网$^ VLl_A
SQL> select year,region,profit ,
%s6JS|9s&Nw8Vg&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 K0YEAR REGION PROFIT LAST_YEAR_EXP51Testing软件测试网u$Gy:x
?/c@mF
---- ------- ---------- -------------51Testing软件测试网DU5T:LBk/W"^E
Uj
2003 Central 101 0
0x'C*}E5fC)W02003 Central 100 10151Testing软件测试网 SV?1]"o#yt
2003 East 102 051Testing软件测试网;iL4LS7D~1C
2004 East 103 102
&Q2V&K-b"i!z02003 West 88 051Testing软件测试网
q,G~E1E
2003 West 88 88
vbV^B02004 West 77 88
g]S5b;H6~)j02004 West 89 7751Testing软件测试网X tQz.b6\6m
51Testing软件测试网:OOWH!Eifn
一表stoptime,中有字段如下:op_time,stop_num 其中op_time为datetime型,stop_num为num型。
9^+U/e.a/L O1g*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&GW0select 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