2017-10-06 2 views
1

j'ai un Tabel qui ressemble à ceci:Retour la ligne avec la valeur de la ligne précédente dans le même groupe (Oracle 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 | 
|--------+------+---------|------| 

Je veux une nouvelle colonne (New_column) qui effectue les opérations suivantes:

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

Dans chaque numéro tête, si le rang est pas 1, prend le montant de la ligne dans le numéro de tête avec le numéro de rang avant qu'il (rang 2 prend le montant de rang 1 dans le même chef et le rang 3 prend la montant du rang 2 dans la même tête et ainsi de suite ...)

Je sais comment réparer avec une boucle For dans d'autres langages de programmation, mais je ne sais pas comment le faire avec SQL.

Répondre

1

Je pense que vous voulez essentiellement lag():

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

La forme à trois arguments de lag() vous permet de fournir une valeur par défaut.

1

Vous pouvez utiliser cette mise à jour:

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

Vous pouvez joindre la même table (sous-requête) sur le rang 1 de la table dérivée.

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