宣布 R2 SQL 支持 GROUP BY、SUM 和其他聚合查詢
2025-12-18
作者:Jérôme Schneider, Nikita Lapkov, Marc Selwan
閱讀時間:8 分鐘
當面對大量數據時,聚合查詢能夠提供快速的數據概覽,這正是 SQL 中聚合功能的優勢所在。聚合查詢,也稱為 “GROUP BY 查詢”,能夠從龐大的數據集中快速獲取洞見。
我們很高興地宣布 R2 SQL 現已支持聚合查詢。R2 SQL 是 Cloudflare 的無伺服器、分佈式分析查詢引擎,能夠在 R2 Data Catalog 中存儲的數據上執行 SQL 查詢。通過聚合查詢,用戶可以輕鬆識別數據中的重要趨勢和變化,生成報表,並在日誌中找到異常。
這一版本的發布基於之前支持的篩選查詢,這些查詢是分析工作負載的基礎,能夠幫助用戶在大量 Apache Parquet 文件中找到所需信息。
分析中聚合的重要性
聚合查詢,即 “GROUP BY 查詢”,生成基礎數據的簡要摘要。
一個常見的應用是生成報表。以一個名為 “sales” 的表格為例,該表格包含某組織在不同國家和部門的所有銷售歷史數據。使用以下聚合查詢可以輕鬆生成按部門劃分的銷售報告:
SELECT department, sum(value) FROM sales GROUP BY department
“GROUP BY” 語句允許我們將表格行拆分成不同的桶,每個桶都有一個對應特定部門的標籤。當桶滿時,我們可以計算每個桶中所有行的 “sum(value)”,從而獲得相應部門的總銷售量。
有時,我們可能只對銷售量最大的部門感興趣,此時 “ORDER BY” 語句非常有用:
SELECT department, sum(value) FROM sales GROUP BY department ORDER BY sum(value) DESC LIMIT 10
這裡,我們指示查詢引擎按銷售總量的降序排序所有部門桶,並僅返回前 10 名。
最後,我們可能對篩選掉異常感興趣。例如,我們可能只想在報告中包含銷售總數超過五筆的部門。可以使用 “HAVING” 語句輕鬆實現:
SELECT department, sum(value), count(*) FROM sales GROUP BY department HAVING count(*) > 5 ORDER BY sum(value) DESC LIMIT 10
這裡我們在查詢中添加了一個新的聚合函數 “count(*)”,計算每個桶中的行數。這直接對應於每個部門的銷售次數,因此我們在 “HAVING” 語句中添加了一個謂詞,確保只保留行數超過五的桶。
聚合的兩種方法:提前計算或延後計算
聚合查詢有一個有趣的特性:它們可以引用未存儲的列。以 “sum(value)” 為例,這一列由查詢引擎即時計算,而非從 R2 上存儲的 Parquet 文件中獲取的 “department” 列。這一細微差別意味著任何引用 “sum”、“count” 等聚合的查詢需要分兩個階段進行。
第一階段是計算新列。如果要使用 “ORDER BY” 語句按 “count()” 列排序數據,或使用 “HAVING” 語句基於其篩選行,我們需要知道該列的值。一旦確定了諸如 “count()” 等列的值,我們就可以繼續執行其餘的查詢。
注意,如果查詢中 “HAVING” 或 “ORDER BY” 未引用聚合函數,但在 “SELECT” 中使用,則可以使用一個技巧。由於不需要直接知...