我将创建一个表,其中ID
是PRIMARY KEY
。我将插入列:Name
、ABSValue
和LastUpdateDate = GETDATE()
。
问题是,我想生成PctChange
值,这些值例如等于:(val1_5-val1_1(/val1_prev*100(下划线后面的数字是ID值(。
我的问题是如何获得以前的值,这样我就可以进行计算,哪个将进入PctChg
?插入时可以这样做吗?
ID | 名称 | ABS值 | >PctChg | LastUpdateDate||
---|---|---|---|---|---|
1 | val 1 | 13 | %>2021/01/08 | ||
2 | val 2 | 45 | 0% | 2021年1月08日||
3 | val 3 | 3 | 0% | 2021年1月9日//tr>||
4 | val 2 | 5 | val 1 |
此方法假定表上存在唯一键(Name,LastUpdateDate(约束。要插入的值被声明为变量。然后在CTE中选择声明的变量,并使用OUTER APPLY来定位每个名称的原始行(根据LastUpdateDate(。百分比变化计算为DECIMAL(14,2(。像这样的东西。
/* values to insert */
declare
@Name varchar(20)='val1',
@ABSValue int=10,
@LastUpdateDate date=getdate();
/* use the select statement to insert into table */
;with
all_cte([Name], ABSValue, LastUpdateDate) as (
select 'val1', 14, cast(dateadd(day, -5, getdate()) as date)
union all
select 'val1', 10, cast(dateadd(day, -3, getdate()) as date)
union all
select 'val3', 10, cast(dateadd(day, -1, getdate()) as date)
union all
select 'val1', 10, cast(dateadd(day, -1, getdate()) as date)),
ins_cte([Name], ABSValue, LastUpdateDate) as (
select @Name, @ABSValue, @LastUpdateDate)
select i.*, oa.*,
cast(case when oa.ABSValue is null then 0
else (i.ABSValue-oa.ABSValue)/(oa.ABSValue*1.0)*100 end as decimal(14, 2)) calc_pct_change
from ins_cte i
outer apply (select top(1) ABSValue
from all_cte a
where i.[Name]=a.[Name]
and i.LastUpdateDate>a.LastUpdateDate
order by LastUpdateDate) oa;
输出
Name ABSValue LastUpdateDate ABSValue calc_pct_change
val1 10 2021-01-13 14 -28.57