返回具有同一组中上一行值的行(Oracle Sql)

返回具有同一组中上一行值的行(Oracle Sql),sql,oracle12c,Sql,Oracle12c,我有一个标签,看起来像这样: |--------+------+---------|------| | Head | ID | Amount | Rank | |--------+------+---------|------| | 1 | 10 | 1000 | 1 | | 1 | 11 | 1200 | 2 | | 1 | 12 | 1500 | 3 | | 2 | 20 | 3400

我有一个标签,看起来像这样:

|--------+------+---------|------|
| 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\u 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

我想你基本上想要
lag()


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

您可以使用此更新:

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上联接相同的表(子查询)

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