我正在嘗試在T-SQL中使用LAG來計算一些滯後功能。當LAG reference page說這個函數是非確定性的時候,我有點擔心。 reference page on function determinism表示「在查詢中指定ORDER BY子句不會改變該查詢中使用的函數的確定性」。但是,我不明白爲什麼LAG會在相同條件下返回不同的結果。如果是這樣,爲什麼人們會使用它?也許我沒有正確解釋「決定論」?謝謝!爲什麼T-SQL中的LAG函數是非確定性的?
回答
在數學和物理,一個確定性系統是一個 系統中沒有隨機性參與 系統未來狀態的發展。因此確定性模型將始終從給定的起始條件或初始狀態產生相同的輸出。 https://en.wikipedia.org/wiki/Deterministic_system
LAG函數本身是不確定的,因爲它的結果可能會有所取決於數據狀態,埃裏克是正確的。在一些數據模型中,當正確應用時,它可以是確定性的(例如,如果您在滯後時通過數字鍵進行排序),但函數定義本身並不是確定性的。
有意義嗎?
有意義,但由OP鏈接的同一頁也聲稱「除非用OVER和ORDER BY子句指定,否則所有聚合函數都是確定性的。」 - 關於數據狀態的相同論點適用於那些... –
LAG需要OVER和ORDER BY才能工作。另外,LAG是一個窗口函數,它不會聚合。 – saarrrr
按照MSDN documentation,非確定性函數中的每一個,他們被稱爲用一組特定的輸入值,即使他們訪問數據庫狀態保持在同一時間返回不同的結果,所以這是不相關的數據的變化(INSERT
,DELETE
,UPDATE
)。
但是,Eric對物理排序順序是正確的。例如,當數據中存在重複行時,物理排序順序可能因查詢而異。在這種情況下,根據所選的執行計劃,LAG
和LEAD
可能會返回不同的結果。另一方面,AVG
函數是確定性的,因爲無論排序順序如何,它都將始終返回相同數據集的相同結果。
- 1. Haskell中的非確定性是什麼?
- 2. NP中的非確定性是什麼?
- 3. 確定性函數是非確定性的
- 4. 什麼是非確定性程序?
- 5. SQL 2005爲什麼說這個UDF是非確定性的?
- 6. 爲什麼功率集在haskell中被認爲是非確定性的例子?
- 7. SQL分區函數中的非確定性函數
- 8. 什麼構成tsql中的非零值?
- 9. 給定一個函數,它是否是線性的,爲什麼?
- 10. Promela - 非確定性不是非確定性的?
- 11. 訪問非確定性資源的最佳方法是什麼?
- 12. 爲什麼列表函子表示非確定性選擇的上下文?
- 13. 「lag」式函數
- 14. 爲什麼tsql函數中的循環只執行一次?
- 15. LAG函數的更多問題是SAS
- 16. 爲什麼makefile表現出非確定性行爲?
- 17. 爲什麼jdk中的「offset + length <0」確定參數是否非法?
- 18. 爲什麼我的窗口函數具有非線性相位?
- 19. 什麼是*確定性併發性*?
- 20. 函數中的函數TSQL
- 21. 爲什麼確定性函數在SQL中執行額外的時間?
- 22. 爲什麼確定性分析器稱爲「確定性」?
- 23. 決定它是否是文件的非確定性行爲?
- 24. PowerShell模塊中正確的函數名稱約定是什麼?
- 25. 爲什麼`boost :: multi_array_ref`的析構函數是非虛擬的?
- 26. 確定爲什麼數據是Spark
- 27. 單線程C++函數調用中的undebuggable非確定性heisenbug
- 28. 流處理中的非確定性函數
- 29. 爲什麼從DATE轉換到VARCHAR非確定性?
- 30. 爲什麼我通過重複獲得非確定性結果()
'LAG提供對位於當前行之前的給定物理偏移處的行的訪問'也許是因爲物理順序可以從查詢的一個執行改變爲下一個,例如,由於INSERT或DELETE? –
如果'AVG'被認爲是確定性的,那麼'LAG'也應該與分區中使用的列的集合和order by是唯一的一樣長。然後不存在歧義,並且對於給定的輸入集將始終返回相同的結果。 –
其實沒有。 AVG不會改變指數重組 - LAT會。 – TomTom