Lead() 和 lag()
lead(
列名
,n,m):
当前记录后面第
n
行记录的
<
列名
>
的值,没有则默认值为
m
;如果不带参数
n,m
,则查找当前记录后面第一行的记录
<
列名
>
的值,没有则默认值为
null
。
lag(
列名
,n,m):
当前记录前面第
n
行记录的
<
列名
>
的值,没有则默认值为
m
;如果不带参数
n,m
,则查找当前记录前面第一行的记录
<
列名
>
的值,没有则默认值为
null
。
--测试脚本
create table tmp_wrh_emp(enamevarchar2(100),job varchar2(100),sal number, deptno number,create_date date);
insert into tmp_wrh_emp(ename ,job ,sal , deptno ,create_date )
select 'ALLEN','dev',1000,10,sysdate from dual
union
select 'BOB','dev',2000,10,sysdate from dual
union
select 'CANDY','dev',3000,10,sysdate from dual
union
select 'DOIL','dev',4000,10,sysdate from dual
union
select 'EPSON','dev',5000,10,sysdate from dual;
select e.ename,
e.job,
e.sal,
e.deptno,
lead(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lead_sal,
lag(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lag_sal,
nvl(lead(e.sal) over(partition by e.deptno order by e.sal) - e.sal,
0) diff_lead_sal,
nvl(e.sal - lag(e.sal) over(partition by e.deptno order by e.sal), 0)diff_lag_sal
from tmp_wrh_emp e;
执行结果:
|
ENAME
|
JOB
|
SAL
|
DEPTNO
|
LEAD_SAL
|
LAG_SAL
|
DIFF_LEAD_SAL
|
DIFF_LAG_SAL
|
1
|
ALLEN
|
dev
|
1000
|
10
|
2000
|
0
|
1000
|
0
|
2
|
BOB
|
dev
|
2000
|
10
|
3000
|
1000
|
1000
|
1000
|
3
|
CANDY
|
dev
|
3000
|
10
|
4000
|
2000
|
1000
|
1000
|
4
|
DOIL
|
dev
|
4000
|
10
|
5000
|
3000
|
1000
|
1000
|
5
|
EPSON
|
dev
|
5000
|
10
|
0
|
4000
|
0
|
1000
|
Lead() 和 lag() lead(列名,n,m): 当前记录后面第n行记录的列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录后面第一行的记录列名>的值,没有则默认值为null。 lag(列名,n,m): 当前记录前面第n行记录的列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录前面第一行的记录列名>的值,没有则默认值为null。 --测试脚本
Hive的分析函数又叫
窗口函数
,在
oracle
中就有这样的分析函数,主要用来做
数据
统计分析的。
Lag
和
Lead
分析函数可以在同一次查询中
取
出同一字段的
前
N
行
的
数据
(
Lag
)和后N
行
的
数据
(
Lead
)作为独立的列。
这种操作可以代替表的自联接,并且
LAG
和
LEAD
有更高的效率,其中over()表示
当前
查询的结果集对象,括号里面的语句则表示对这个结果集进
行
处理。
LAG
(c...
lag
和
lead
函数可以在同一次查询中
取
出同一字段的
前
N
行
数据
(
lag
)和后N
行
数据
(
lead
)。这种字段可以使用对相同表的表连接来实现,不过使用
lag
和
lead
函数具有更高的效率。
SELECT *
FROM (select pid,
sp.Psnname,
sp.Upbid,
sp.Updid,
sp.startdate,
sp.enddate,
lag
(enddate, 1, null) o...
SELECT @num:=@num+1 AS rownum, holiday.*
FROM holiday,(SELECT @num:=0) as r
ORDER BY cr_date
)t1,(
-- 查询
当前
记录
对应序号
select curNum from(
SELECT @num2:=@num2+1 AS curNum, holiday.*
FROM holiday ,(SELECT @num2
select DISTINCT newmeasure.outpatient_no,newmeasure.name,pre.current_gestational_week,
pem.systolic,pem.diastolic,pem.systolic_2,pem.diastolic_2,pem.systolic_3,pem.diastolic_3,
pem.temperature,pem.pulse,pem.height,pem.weight,ppr.preweight,ppr.bmi,
SQL
中的
LAG
和
LEAD
函数用于获
取
结果集中某
一行
前
面或后面的
值
。
LAG
函数返回结果集中指定列上
当前
行
之
前
的某
一行
的
值
。通过向
LAG
函数提供偏移量来指定要返回的
前
一行
的
行
数。
LEAD
函数返回结果集中指定列上
当前
行
之后的某
一行
的
值
。通过向
LEAD
函数提供偏移量来指定要返回的后
一行
的
行
数。
这些函数一般用于分析
数据
的趋势和变化,例如计算时间序列
数据
中的变化率等。
下面是一个使用
LAG
和
LEAD
函数的例子:
SELECT
employee_id,
salary,
LAG
(salary) OVER (ORDER BY hire_date) AS prev_salary,
LEAD
(salary) OVER (ORDER BY hire_date) AS next_salary
employees
这个例子中,我们使用
LAG
函数获
取
了每个员工
前
一个雇佣日期的薪资,使用
LEAD
函数获
取
了每个员工后一个雇佣日期的薪资。
oracle 拆分类型为多行(regexp_substr) 与 多个行汇总合并(listagg(codecname,‘,‘)within group(order by endortype))到一个字段
2021-10-19