我試圖了解,分析功能如何在內部作業。
ID,Amt
A,1
B,2
C,3
D,4
E,5
total如果我運行它,將針對每條記錄給出列中所有金額的總和。
Select ID, SUM (AMT) OVER () total from table
但是當我運行它時,它會給我累積總和
Select ID, SUM (AMT) OVER (order by ID) total from table
試圖了解當它OVER()和OVER(order by ID)
我的理解是,當沒有定義磁區時OVER,它會將所有內容視為單個磁區。但是不明白當我們在里面加order by Id的時候over(),怎么開始做累加的呢?
任何人都可以分享幕后發生的事情嗎?
uj5u.com熱心網友回復:
這是一個有趣的案例,根據這里的檔案是解釋和示例。
如果未指定PARTITION BY,則該函式將查詢結果集的所有行視為單個磁區。如果不指定ORDER BY子句,函式將應用于磁區中的所有行。
所以如果你指定ORDER BY然后
如果已指定,并且未指定 ROWS/RANGE,則默認 RANGE UNBOUNDED PRECEDING 和 CURRENT ROW將由可以接受可選 ROWS/RANGE 規范(例如 min 或 max)的函式用作視窗框架的默認值。
所以從技術上講,這兩個命令是相同的:
SELECT ID, SUM(AMT) OVER (ORDER BY ID) total FROM table
SELECT ID, SUM(AMT) OVER (ORDER BY ID RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total FROM table
有關您的更多資訊,請參閱檔案:https ://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-ver15
uj5u.com熱心網友回復:
這與 Oracle 本身無關,但它是 SQL 標準的一部分,并且在包括 Oracle、DB2、PostgreSQL、SQL Server、MySQL、MariaDB、H2 等在內的許多資料庫中的行為方式相同。
根據定義,當您包含該ORDER BY子句時,引擎將在每個磁區內生成“運行值”(累積聚合);如果沒有該ORDER BY子句,它會生成聚合整個磁區的相同的單個值。
現在,磁區本身主要由PARTITION BY子句定義。在沒有它的情況下,整個結果集被視為一個磁區。
ROWS最后,作為一個更高級的主題,可以使用“框架”子句(和RANGE)和“框架排除”子句( )進一步調整磁區EXCLUDE。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422040.html
標籤:
