;with data as (
select id, d, name, rating, dyn
, LAG(rating,1, null) over (partition by name order by d asc) as x
FROM @sample
--order by name, d desc
)
update data
set dyn = case when x is null then 0 else x - rating end;
结果将是
id d name rating dyn
----------- ---------- ---------- ----------- -----------
3 2019-10-11 Иванов 5 9
6 2019-09-30 Иванов 14 -11
9 2019-08-31 Иванов 3 0
2 2019-10-11 Петренко 2 5
5 2019-09-30 Петренко 7 -5
8 2019-08-31 Петренко 2 0
1 2019-10-11 Сидоров 4 2
4 2019-09-30 Сидоров 6 5
7 2019-08-31 Сидоров 11 0
自 2012 版以来的窗口函数中有
lag和lead,允许访问选择的上一行/下一行。因此,如果您的输入数据(以及未来,请提供生成图表的代码,而不是图片)如下所示:
它将
lag(rating, 1, null)获得上一行中的值。如果没有,那么我们将返回它null。如果我们在 CTE 中没有 null,那么我们考虑差异,如果为 null,那么我们将其设置为零。结果将是