--删除表
drop table test;
--创建表
create table test (
id number,
name varchar2(20),
sal number,
hdate date
);
--插入模拟数据
insert into test values (1,'张三',3000,sysdate-3);
insert into test values (1,'李四',3110,sysdate-3);
insert into test values (1,'王五',3220,sysdate-3);
insert into test values (1,'赵六',3330,sysdate-3);
insert into test values (2,'张三',3000,sysdate-2);
insert into test values (2,'李四',4230,sysdate-2);
insert into test values (2,'王五',5410,sysdate-2);
insert into test values (2,'赵六',6537,sysdate-2);
insert into test values (3,'张三',4000,sysdate-1);
insert into test values (3,'李四',5208,sysdate-1);
insert into test values (3,'王五',6414,sysdate-1);
insert into test values (3,'赵六',9523,sysdate-1);
--提交
commit;
--打印员工信息,并lag漂移函数打印员工历史差,注意:若用值去减去空值,则还是空,所以在对比结果中增加nvl函数
select t.*,lag(sal)over(partition by name order by sal ) l_lag,nvl(sal-lag(sal)over(partition by name order by sal ),0) l_diff from test t;
--打印结果
增薪次数
1 1 张三 3000 2023/9/24 9:31:35 0
2 2 张三 3000 2023/9/25 9:31:35 3000 0
3 3 张三 4000 2023/9/26 9:31:35 3000 1000
4 1 李四 3110 2023/9/24 9:31:35 0
5 2 李四 4230 2023/9/25 9:31:35 3110 1120
6 3 李四 5208 2023/9/26 9:31:35 4230 978
7 1 王五 3220 2023/9/24 9:31:35 0
8 2 王五 5410 2023/9/25 9:31:35 3220 2190
9 3 王五 6414 2023/9/26 9:31:35 5410 1004
10 1 赵六 3330 2023/9/24 9:31:35 0
11 2 赵六 6537 2023/9/25 9:31:35 3330 3207
12 3 赵六 9523 2023/9/26 9:31:35 6537 2986
--使用临时表,增加分析函数排序
with t1 as(
select t.*,
lag(sal) over(partition by name order by sal) l_lag,
nvl (sal - lag(sal) over(partition by name order by sal),0) l_diff
from test t
) , t2 as(
select t1.* ,(rank()over (partition by t1.name order by t1.l_diff desc)) rn from t1
)
select * from t2 where rn=1;
--打印结果
增薪次数
1 3 张三 4000 2023/9/26 9:31:35 3000 1000 1
2 2 李四 4230 2023/9/25 9:31:35 3110 1120 1
3 2 王五 5410 2023/9/25 9:31:35 3220 2190 1
4 2 赵六 6537 2023/9/25 9:31:35 3330 3207 1