我有张桌子,看起来像这样:
|--------+------+---------|------|
| 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进行修复。
发布于 2017-10-06 10:02:08
我觉得你基本上想让lag()
select t.*,
lag(amount, 1, amount) over (partition by head order by rank) as new_column
from t;lag()的三个参数形式允许您提供一个默认值。
发布于 2017-10-06 10:09:54
您可以使用此更新:
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发布于 2017-10-06 10:22:46
您可以在派生表的秩-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-1https://stackoverflow.com/questions/46603116
复制相似问题