2016-12-21 118 views
4

我有一张表,学生每年都有名称和评级。Oracle查询获取同一个表中相关行的前一个值

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); 

有没有办法实现这个使用选择查询?

回答

2

使用LAG分析功能https://docs.oracle.com/database/122/SQLRF/LAG.htm#SQLRF00652

LAG是解析函数。它可以同时访问一个表的多个行 ,而无需自加入。给定从查询返回的一系列 行和光标的位置,LAG提供 访问位于该位置之前的给定物理偏移处的行。

对于可选的偏移参数,请指定一个大于零的整数 。如果您未指定偏移量,则其默认值为1.如果偏移量超出窗口范围 ,则返回 可选默认值。如果您未指定默认值,则其默认值为 null。

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; 
+0

非常感谢它的工作! – user2719441

+0

@ user2719441 :-)请检查答案是否被接受 – hinotf

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 
相关问题