分析函数first_value和last_value首行函数

first_valus首行函数

语法:first_value(字段名)over(partition by 分组字段名 order by  排序字段名 desc)

用于取值第一行的值!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
--删除表
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;

--打印员工信息,并ag漂移函数打印员工历史差注意:若用值去减去空值,则还是空所以在对比结果中增加vl函数
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;


--使用临时表,增加分析函数排序
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.*,first_value(t1.l_diff)over(partition by t1.name order by  t1.l_diff desc) ll_diff from t1
)
select * from t2 where l_diff=ll_diff;

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.*,first_value(t1.l_diff)over(partition by t1.name order by  t1.l_diff desc) ll_diff from t1
)
select * from t2 where l_diff=ll_diff;

last_valus尾行函数,暂时不太会用!和sum聚合函数类型会做递归对比!!!不太会用啊