我想根据'n_paiement'的值和'montant_dernier_paiement'的值(其中'is_paiement'= 1)更新列“ montant_dernier_paiement”:
目前还不太清楚,我想为8-9-10行设置“ montant_dernier_paiement” = 25.78,为12-13行设置= 13.81
有人有什么想法/线索吗?
非常感谢!
答案 0 :(得分:0)
尝试一下:
update q
set montant_dernier_paiement = c.montant_dernier_paiement
from tbl q join tbl c
on c.n_paiement = q.n_paiement and c.is_paiement = 1
答案 1 :(得分:0)
尝试这样的事情...
UPDATE table_name set montant_dernier_paiement = 25.78 WHERE n_paiement = 1
UPDATE table_name set montant_dernier_paiement = 13.81 WHERE n_paiement = 2
答案 2 :(得分:0)
如果每个n_paiment
仅具有一个值,则可以使用简单的窗口函数:
with toupdate as (
select t.*,
max(montant_dernier_paiment) over (partition by n_paiement) as max_mdp
from t
)
update toupdate
set montant_dernier_paiment = max_mdp
where montant_dernier_paiment <> max_mdp or (montant_dernier_paiment is null and max_mdp is not null);
如果上述内容不正确,那么您等于lag(ignore nulls)
。 SQL Server不支持此功能,但是您可以使用first_value()
:
with toupdate as (
select t.*,
max(montant_dernier_paiment) over (partition by n_paiement) as max_mdp,
first_value(montant_dernier_paiment) over
(partition by n_paiement
order by (case when montant_dernier_paiment is null then 1 else 2 end) desc,
tri desc
) as prev_mdp
from t
)
update toupdate
set montant_dernier_paiment = prev_mdp
where montant_dernier_paiment <> prev_mdp or (montant_dernier_paiment is null and prev_mdp is not null);
您也可以使用apply
来表达这一点:
update t
set montant_dernier_paiment = t2.montant_dernier_paiment
from t cross apply
(select top (1) t.*
from t t2
where t2.n_paiement = t.n_paiement and
t2.tri < t.tri and
t2.montant_dernier_paiment is not null
order by t2.tri desc
) t2
where t.montant_dernier_paiment <> t2.montant_dernier_paiment or (t.montant_dernier_paiment is null and t2.montant_dernier_paiment is not null);