以下顯示的聚合函數預設可用。還有兩個聚合函數與 JSON SQL 函數 分組。應用程式可以使用 sqlite3_create_function() 介面定義自訂聚合函數。API。
在任何只有一個引數的聚合函數中,該引數前面都可以加上 DISTINCT 關鍵字。在這種情況下,重複元素會在傳遞到聚合函數之前先過濾掉。例如,「count(distinct X)」函數會傳回 X 欄位的相異值數目,而不是 X 欄位中非空值的總數。
如果提供了 FILTER 子句,則只會將 expr 為 true 的列包含在聚合中。
如果提供了 ORDER BY 子句,則該子句會決定處理聚合輸入的順序。對於 max() 和 count() 等聚合函數,輸入順序並不重要。但對於 string_agg() 和 json_group_object() 等函數,ORDER BY 子句會影響結果。如果未指定 ORDER BY 子句,則聚合輸入會以任意順序發生,而這個順序可能會在每次呼叫時改變。
avg(X)
avg() 函數會傳回群組中所有非 NULL X 的平均值。看起來不像數字的字串和 BLOB 值會被解譯為 0。只要至少有一個非 NULL 輸入,avg() 的結果就會永遠是浮點數值,即使所有輸入都是整數。如果沒有非 NULL 輸入,avg() 的結果會是 NULL。avg() 的結果會以 total()/count() 計算,因此適用於 total() 的所有限制也適用於 avg()。
count(X)
count(*)
count(X) 函數會傳回群組中 X 非 NULL 的次數。count(*) 函數(沒有引數)會傳回群組中的總列數。
group_concat(X)
group_concat(X,Y)
string_agg(X,Y)
group_concat() 函數會傳回一個字串,它是 X 所有非 NULL 值的串接。如果引數 Y 存在,它會用作 X 執行個體之間的分隔符號。如果省略 Y,會使用逗號 (",") 作為分隔符號。
string_agg(X,Y) 函數是 group_concat(X,Y) 的別名。String_agg() 與 PostgreSQL 和 SQL-Server 相容,而 group_concat() 與 MySQL 相容。
串接元素的順序是任意的,除非在最後一個引數之後立即包含 ORDER BY 引數。
max(X)
max() 聚合函數會傳回群組中所有值的最大值。最大值是在同一欄位上執行 ORDER BY 時會傳回的最後一個值。如果群組中沒有非 NULL 值,聚合 max() 會傳回 NULL。
min(X)
min() 聚集函數會傳回群組中所有值中非 NULL 值的最小值。最小值是會出現在該欄 ORDER BY 中的第一個非 NULL 值。如果群組中沒有非 NULL 值,聚集函數 min() 會傳回 NULL。
sum(X)
total(X)
sum() 和 total() 聚集函數會傳回群組中所有非 NULL 值的總和。如果沒有非 NULL 輸入列,sum() 會傳回 NULL,但 total() 會傳回 0.0。對於沒有列的總和來說,NULL 通常不是有用的結果,但 SQL 標準需要它,而且大多數其他 SQL 資料庫引擎都以這種方式實作 sum(),因此 SQLite 也以相同的方式實作,以保持相容性。非標準的 total() 函數提供一種便利的方式,可以解決 SQL 語言中這個設計問題。
total() 的結果總是浮點值。如果所有非 NULL 輸入都是整數,sum() 的結果是整數值。如果 sum() 的任何輸入都不是整數或 NULL,sum() 會傳回一個浮點值,它是數學總和的近似值。
如果所有輸入都是整數或 NULL,而且在運算過程中任何一點發生整數溢位,sum() 會擲出「整數溢位」例外狀況。如果任何先前的輸入是浮點值,則永遠不會引發溢位錯誤。Total() 永遠不會擲出整數溢位。
在對浮點值求和時,如果值的數量級相差很大,則由於 IEEE 754 浮點值是近似值,因此產生的總和可能不精確。在 小數延伸模組 中使用 decimal_sum(X) 聚集函數,以取得浮點數的精確總和。考慮這個測試案例
CREATE TABLE t1(x REAL); INSERT INTO t1 VALUES(1.55e+308),(1.23),(3.2e-16),(-1.23),(-1.55e308); SELECT sum(x), decimal_sum(x) FROM t1;
大值 ±1.55e+308 互相抵消,但抵消直到總和結束才發生,而在此同時,大值 +1.55e+308 淹沒了微小的值 3.2e-16。最終結果是 sum() 的不精確結果。decimal_sum() 聚集函數會產生精確的答案,但代價是額外的 CPU 和記憶體使用量。另外請注意,decimal_sum() 沒有內建在 SQLite 核心;它是一個 可載入延伸模組。
如果輸入總和過大,無法表示為 IEEE 754 浮點數值,則可能會傳回 +Infinity 或 -Infinity 結果。如果使用符號不同的非常大值,使得 SUM() 或 TOTAL() 函數無法判斷正確結果是 +Infinity、-Infinity 或介於兩者之間的其他值,則結果為 NULL。因此,例如,下列查詢傳回 NULL
WITH t1(x) AS (VALUES(1.0),(-9e+999),(2.0),(+9e+999),(3.0)) SELECT sum(x) FROM t1;
此頁面最後修改於 2023-12-05 14:43:20 UTC