为啥 T-SQL 中的 LAG 函数是不确定的?

Posted

技术标签:

【中文标题】为啥 T-SQL 中的 LAG 函数是不确定的?【英文标题】:Why the LAG function in T-SQL is non-deterministic?为什么 T-SQL 中的 LAG 函数是不确定的? 【发布时间】:2016-02-19 16:57:38 【问题描述】:

我正在尝试在 T-SQL 中使用 LAG 来计算一些滞后特性。当LAG reference page 说这个函数是不确定的时,我有点担心。 reference page on function determinism 表示“在查询中指定 ORDER BY 子句不会改变在该查询中使用的函数的确定性”。但是,我不明白为什么 LAG 在相同条件下会返回不同的结果。如果是这样,人们为什么要使用它?也许我没有正确解释“决定论”?谢谢!

【问题讨论】:

LAG provides access to a row at a given physical offset that comes before the current row 可能是因为物理顺序可以从查询的一次执行更改为下一次执行,例如由于 INSERT 或 DELETE? 如果AVG被认为是确定性的,那么LAG也应该是只要partition by和order by中使用的列集是唯一的。那么就没有歧义了,对于给定的输入集,它总是会返回相同的结果。 其实没有。 AVG 不会因索引重组而改变 - LAT 会。 @TomTom - 只要 partition by 和 order by 中使用的列集是唯一的,索引重组就无关紧要。 SUMAVG 当然可以根据顺序更改它们在此处显示的值blogs.msdn.com/b/khen1234/archive/2005/05/13/417153.aspx 【参考方案1】:

根据 MSDN documentation,即使它们访问的数据库状态保持不变,非确定性函数在每次使用一组特定的输入值调用时都可能返回不同的结果,因此这与数据更改无关( INSERT, DELETE, UPDATE)。

但是,关于物理排序顺序,Eric 是正确的。物理排序顺序可能因一个查询而异,例如当数据中有重复行时。在那种情况下,LAGLEAD 可以根据选择的执行计划返回不同的结果。另一方面,AVG 函数是确定性的,因为无论排序顺序如何,它总是会为相同的数据集返回相同的结果。

【讨论】:

【参考方案2】:

在数学和物理学中,确定性系统是一个系统 未来状态的发展不涉及随机性 系统。因此,确定性模型将始终产生相同的 从给定的起始条件或初始状态输出。 https://en.wikipedia.org/wiki/Deterministic_system

LAG 函数本身不是确定性的,因为它的结果可能会根据数据状态而变化,Eric 是正确的。在某些数据模型中,如果应用正确,它可以是确定性的(例如,如果您在滞后中按数字键排序),但函数定义本身不是确定性的。

有意义吗?

【讨论】:

有道理,但由 OP 链接的同一页面还声称“所有聚合函数都是确定性的,除非它们使用 OVER 和 ORDER BY 子句指定。” - 关于数据状态的相同论点适用于那些...... OVER 和 ORDER BY 是 LAG 工作所必需的。另外,LAG 是一个窗口函数,它不会聚合。

以上是关于为啥 T-SQL 中的 LAG 函数是不确定的?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 中的 LAG 函数

在 T-SQL 中是不是有一个内置命令来确定一个数字是不是在另一个表的范围内

pyspark 是不是支持窗口函数(例如 first、last、lag、lead)?

MSSQL 为啥这个函数是不确定的

为啥 LAG 除了一行之外的所有内容都返回 null?

不能对不可变值使用变异成员:函数调用返回不可变值 - 不确定为啥值是不可变的