返回具有同一组中上一行值的行(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