等效于LAG的SQL以创建计算表

问题描述

我对sql还是很陌生,我正在尝试在表中创建一个计算列,该表用于计算当前行和上一行之间的列上的DateDiff。

现在一切正常,丹迪用Select进行查询显示此值:

SELECT *,Case When INCM<> lag(INCM) over(ORDER BY INCM ASC,Submit_Date ASC) Then 0 else DateDiff(mi,Submit_Date,lag(Submit_Date) over (ORDER BY INCM ASC,Submit_Date ASC)) End As Diff
  FROM [OP].[Ticket_Work_Info]

但是,正如我最近发现的那样,在将具有这种逻辑的计算列添加到现有表中时,出现了一个错误提示窗口函数只能与Select或Order By一起使用。

我一直在各处搜索与LAG等效的东西,以用于在表上创建计算列。

与此同时,我最终用这段代码创建了一个视图,但这并不是我真正想要做的。

有人可以帮我吗?

此致

解决方法

以下是为什么为什么计算列只能引用当前行中的值(以及确定性函数和常量)的一些原因。考虑如下定义:

create t (
    t_id int,a varchar(255),x int,prev_x as (lag(x) over (order by t_id)
);

以及一些示例数据:

id      y      x
 1      z      6
 2      abc    28
 3      z      496

这看起来不错。但是,请考虑以下查询:

select t.*
from t
where a <> 'abc';

第三行的x_prev值应该是28还是6?

我猜没有人愿意对此做出决定。相反,我们的想法是 row 是定义明确的,因此过滤条件不会影响一行中的值。