2017-10-06 69 views
1

我有一个TABEL,看起来像这样的:做以下同一组中与前行的值返回行(甲骨文SQL)

|--------+------+---------|------| 
| Head | ID | Amount | Rank | 
|--------+------+---------|------| 
|  1 | 10 | 1000 | 1 | 
|  1 | 11 | 1200 | 2 | 
|  1 | 12 | 1500 | 3 | 
|  2 | 20 | 3400 | 1 | 
|  2 | 21 | 3600 | 2 | 
|  2 | 22 | 4200 | 3 | 
|  2 | 23 | 1700 | 4 | 
|--------+------+---------|------| 

我希望有一个新的列(New_column):

|--------+------+---------|------|------------| 
| Head | ID | Amount | Rank | New_column | 
|--------+------+---------|------|------------| 
|  1 | 10 | 1000 | 1 | 1000  | 
|  1 | 11 | 1200 | 2 | 1000  | 
|  1 | 12 | 1500 | 3 | 1200  | 
|  2 | 20 | 3400 | 1 | 3400  | 
|  2 | 21 | 3600 | 2 | 3400  | 
|  2 | 22 | 4200 | 3 | 3600  | 
|  2 | 23 | 1700 | 4 | 4200  | 
|--------+------+---------|------|------------| 

在每个头编号,如果秩是不为1,取行的量的起始号内的排名它(等级2采用秩1的量之前相同的头内和等级3取在同一个头内的等级2的数量等等......)

我知道如何用其他编程语言的For循环修复它,但不知道如何使用SQL来完成。

回答

1

我想你基本上要lag()

select t.*, 
     lag(amount, 1, amount) over (partition by head order by rank) as new_column 
from t; 

lag()的三个参数的形式允许你提供一个默认值。

1

您可以使用此更新:

UPDATE your_table b 
SET New_column = CASE WHEN rank = 1 then Amount 
         ELSE (select a.Amount FROM your_table a where a.ID = b.ID and a.rank = b.rank-1) END 
1

您可以在派生表的秩1加入到同一个表(子查询)。

select t1.*,case when t1.rank=1 then amount else t2.amount new_amount 
    from your_table t1 left join (select Head,ID,Amount,Rank from your_table) t2 
    on t1.head=t2.head and t1.rank=t2.rank-1