基于上次更新日期列创建ID列



我将创建一个表,其中IDPRIMARY KEY。我将插入列:NameABSValueLastUpdateDate = GETDATE()

问题是,我想生成PctChange值,这些值例如等于:(val1_5-val1_1(/val1_prev*100(下划线后面的数字是ID值(。

我的问题是如何获得以前的值,这样我就可以进行计算,哪个将进入PctChg?插入时可以这样做吗?

>LastUpdateDate%>2021年1月08日2021年1月9日//tr>
ID 名称 ABS值PctChg
1 val 1 132021/01/08
2 val 2 45 0%
3 val 3 3 0%
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

最新更新