我有一张学生表,其名称和评级为明年。
Name Year Rating
Ram 2016 10
Sam 2016 9
Ram 2014 8
Sam 2012 7
我需要找到员工之前的评级,可能是去年或几年前。
查询应返回结果
Name Cur_rating_year_2016 Prev_rating
Ram 10 8
Sam 9 7
以下是插入和创建
的脚本Create table Student (name varchar2(10), year number, rating number );
insert into student values('Ram' ,2016 ,10);
insert into student values('Sam' ,2016 ,9);
insert into student values('Sam' ,2012 ,7);
insert into student values('Ram' ,2014 ,8);
有没有办法使用select query来实现这个目标?
答案 0 :(得分:2)
使用LAG
分析函数https://docs.oracle.com/database/122/SQLRF/LAG.htm#SQLRF00652
LAG是一种分析功能。它提供对多行的访问 没有自我加入的同时一张桌子。鉴于一系列 LAG提供的查询返回的行和游标的位置 在该位置之前访问给定物理偏移处的行。
对于可选的offset参数,请指定一个更大的整数 比零。如果未指定偏移量,则其默认值为1. 如果偏移量超出范围,则返回可选的默认值 的窗口。如果未指定default,则默认为 空。
SELECT stud_name AS name,
r_year AS year,
r_value AS rating,
lag(r_value, 1, NULL) OVER(PARTITION BY stud_name ORDER BY r_year) AS prev_rating
FROM stud_r
ORDER BY stud_name;
答案 1 :(得分:0)
尝试:
SELECT A.NAME,A.RATING,B.RATING FROM
STUDENTS A INNER JOIN STUDENTS B
ON A.NAME=B.NAME
WHERE A.YEAR='2016' AND B.YEAR<>'2016'
ORDER BY A.NAME ASC