2016-12-21 117 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 
相關問題