lag()和lead()

lag()和lead()
【语法】
lag(EXPR,<OFFSET>,<DEFAULT>)
LEAD(EXPR,<OFFSET>,<DEFAULT>)
【功能】表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的) 
lead()  下一个值 lag()  上一个值

【参数】
EXPR是从其他行返回的表达式 
OFFSET是缺省为1 的正数,表示相对行数。希望检索的当前行分区的偏移量
DEFAULT是在OFFSET表示的数目超出了分组的范围时返回的值。
【说明】Oracle分析函数


【示例】
-- Create table
create table LEAD_TABLE
(
CASEID VARCHAR2(10),
STEPID VARCHAR2(10),
ACTIONDATE DATE
)
tablespace COLM_DATA
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);

insert into LEAD_TABLE values('Case1','Step1',to_date('20070101','yyyy-mm-dd'));
insert into LEAD_TABLE values('Case1','Step2',to_date('20070102','yyyy-mm-dd'));
insert into LEAD_TABLE values('Case1','Step3',to_date('20070103','yyyy-mm-dd'));
insert into LEAD_TABLE values('Case1','Step4',to_date('20070104','yyyy-mm-dd'));
insert into LEAD_TABLE values('Case1','Step5',to_date('20070105','yyyy-mm-dd'));
insert into LEAD_TABLE values('Case1','Step4',to_date('20070106','yyyy-mm-dd'));
insert into LEAD_TABLE values('Case1','Step6',to_date('20070101','yyyy-mm-dd'));
insert into LEAD_TABLE values('Case1','Step1',to_date('20070201','yyyy-mm-dd'));
insert into LEAD_TABLE values('Case2','Step2',to_date('20070202','yyyy-mm-dd'));

在SQL中,LAGLEAD函数是用于在结果集中获取当前行之前或之后某一行的值的窗口函数。 ### LAG函数 LAG函数用于获取结果集中当前行之前的某一行的值,其语法为: ```sql LAG (scalar_expression [,offset] [,default]) OVER ([partition_by_clause ] order_by_clause ) ``` 汉字解释为: ```sql LAG (字段 [,偏移量默认为1] [,如果没有值时候默认值]) OVER ( [ partition_by 字段 ] order_by 字段 ) ``` 参数说明: - `scalar_expression`:要获取值的字段。 - `offset`:偏移量,即当前行之前的行数,默认为1。 - `default`:如果没有值时的默认值。 - `partition_by_clause`:可选,用于对结果集进行分区。 - `order_by_clause`:用于指定结果集的排序顺序。 示例代码如下: ```sql -- 测试数据 if not object_id(N'Tempdb..#T') is null drop table #T Create table #T([Id] int,[Value] int) Insert #T select 1,10 union all select 2,20 union all select 3,30 union all select 4,40 union all select 5,50 SELECT *, LAG(Value, 2, 888) OVER (ORDER BY Value) AS LAGVALUE -- 滞后2行,默认值888 FROM #T; ``` 该示例中,`LAG(Value, 2, 888) OVER (ORDER BY Value)`表示获取当前行之前第2行的`Value`字段的值,如果没有值则返回默认值888,结果集按`Value`字段排序。 ### LEAD函数 LEAD函数用于获取结果集中当前行之后的某一行的值,其语法为: ```sql LEAD (scalar_expression [,offset] [,default]) OVER ([partition_by_clause ] order_by_clause ) ``` 汉字解释为: ```sql LEAD (字段 [,偏移量默认为1] [,如果没有值时候默认值]) OVER ( [ partition_by 字段 ] order_by 字段 ) ``` 参数说明与LAG函数相同。 示例代码如下: ```sql -- 测试数据 if not object_id(N'Tempdb..#T') is null drop table #T Create table #T([Id] int,[Value] int) Insert #T select 1,10 union all select 2,20 union all select 3,30 union all select 4,40 union all select 5,50 SELECT *, LEAD(Value, 1, 666) OVER (ORDER BY Value) AS LEADVALUE -- 提前1行,默认值666 FROM #T; ``` 该示例中,`LEAD(Value, 1, 666) OVER (ORDER BY Value)`表示获取当前行之后第1行的`Value`字段的值,如果没有值则返回默认值666,结果集按`Value`字段排序。 ### 不指定偏移量默认值的情况 也可以不写偏移数默认值,此时偏移量默认为1,没有值时返回`NULL`。示例代码如下: ```sql -- 测试数据 if not object_id(N'Tempdb..#T') is null drop table #T Create table #T([Id] int,[Value] int) Insert #T select 1,10 union all select 2,20 union all select 3,30 union all select 4,40 union all select 5,50 SELECT *, LEAD(Value) OVER (ORDER BY Value) AS LEADVALUE, -- 提前1行 LAG(Value) OVER (ORDER BY Value) AS LAGVALUE -- 滞后1行 FROM #T; ``` ### 结合分区使用 还可以结合`PARTITION BY`子句对结果集进行分区,在每个分区内进行偏移操作。示例代码如下: ```sql -- 测试数据 if not object_id(N'Tempdb..#T') is null drop table #T Create table #T([Group] varchar(10), [Value] int) Insert #T select 'A', 10 union all select 'A', 20 union all select 'B', 30 union all select 'B', 40 SELECT *, LEAD(Value) OVER (PARTITION BY [Group] ORDER BY Value) AS LEADVALUE, LAG(Value) OVER (PARTITION BY [Group] ORDER BY Value) AS LAGVALUE FROM #T; ``` 该示例中,结果集按`Group`字段进行分区,在每个分区内按`Value`字段排序,然后分别获取当前行之后之前的行的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值