【问题标题】:SQL Equivalent to LAG() to create a computed tableSQL 等效于 LAG() 创建计算表
【发布时间】:2020-12-22 21:54:21
【问题描述】:

我是 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 等效的方法,用于在表上创建计算列。

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

有人可以帮帮我吗?

问候,

【问题讨论】:

  • 您只能使用用户定义的函数来执行此操作。更好的选择是使用视图。
  • 在计算列中没有其他行需要考虑,因此允许窗口、聚合或分析函数没有意义。 LAG() 在哪个结果集上?
  • 明白了,我继续看风景。

标签: sql azure powerapps


【解决方案1】:

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

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 是明确定义的,因此过滤条件不会影响行内的值。

【讨论】:

  • 谢谢,我就去看看
猜你喜欢
  • 2016-01-21
  • 1970-01-01
  • 2011-01-25
  • 2021-12-21
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2022-06-14
  • 2021-06-01
相关资源
最近更新 更多