2016-02-19 64 views
4

我正在嘗試在T-SQL中使用LAG來計算一些滯後功能。當LAG reference page說這個函數是非確定性的時候,我有點擔心。 reference page on function determinism表示「在查詢中指定ORDER BY子句不會改變該查詢中使用的函數的確定性」。但是,我不明白爲什麼LAG會在相同條件下返回不同的結果。如果是這樣,爲什麼人們會使用它?也許我沒有正確解釋「決定論」?謝謝!爲什麼T-SQL中的LAG函數是非確定性的?

+2

'LAG提供對位於當前行之前的給定物理偏移處的行的訪問'也許是因爲物理順序可以從查詢的一個執行改變爲下一個,例如,由於INSERT或DELETE? –

+1

如果'AVG'被認爲是確定性的,那麼'LAG'也應該與分區中使用的列的集合和order by是唯一的一樣長。然後不存在歧義,並且對於給定的輸入集將始終返回相同的結果。 –

+0

其實沒有。 AVG不會改變指數重組 - LAT會。 – TomTom

回答

3

在數學和物理,一個確定性系統是一個 系統中沒有隨機性參與 系統未來狀態的發展。因此確定性模型將始終從給定的起始條件或初始狀態產生相同的輸出。 https://en.wikipedia.org/wiki/Deterministic_system

LAG函數本身是不確定的,因爲它的結果可能會有所取決於數據狀態,埃裏克是正確的。在一些數據模型中,當正確應用時,它可以是確定性的(例如,如果您在滯後時通過數字鍵進行排序),但函數定義本身並不是確定性的。

有意義嗎?

+0

有意義,但由OP鏈接的同一頁也聲稱「除非用OVER和ORDER BY子句指定,否則所有聚合函數都是確定性的。」 - 關於數據狀態的相同論點適用於那些... –

+0

LAG需要OVER和ORDER BY才能工作。另外,LAG是一個窗口函數,它不會聚合。 – saarrrr

6

按照MSDN documentation,非確定性函數中的每一個,他們被稱爲用一組特定的輸入值,即使他們訪問數據庫狀態保持在同一時間返回不同的結果,所以這是不相關的數據的變化(INSERTDELETEUPDATE)。

但是,Eric對物理排序順序是正確的。例如,當數據中存在重複行時,物理排序順序可能因查詢而異。在這種情況下,根據所選的執行計劃,LAGLEAD可能會返回不同的結果。另一方面,AVG函數是確定性的,因爲無論排序順序如何,它都將始終返回相同數據集的相同結果。

相關問題