为什么T-SQL中的LAG功能是非确定性的?

时间:2016-02-19 16:57:39

标签: sql-server tsql lag non-deterministic

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

2 个答案:

答案 0 :(得分:7)

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

然而,Eric对于物理排序顺序是正确的。物理排序顺序可能因查询而异,例如,当数据中存在重复行时。在该方案中,LAGLEAD可以根据所选的执行计划返回不同的结果。另一方面,AVG函数是确定性的,因为无论排序顺序如何,它都将始终为相同的数据集返回相同的结果。

答案 1 :(得分:2)

  

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

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

有意义吗?