Oracle查询以获取同一表中相关行的先前值

时间:2016-12-21 07:02:37

标签: 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);

有没有办法使用select query来实现这个目标?

2 个答案:

答案 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