<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Cloudflare changelogs | R2 SQL</title><description>Cloudflare changelogs for R2 SQL</description><link>https://developers.cloudflare.com/changelog/</link><item><title>R2 SQL - R2 SQL now supports UNION, INTERSECT, EXCEPT, and SELECT DISTINCT</title><link>https://developers.cloudflare.com/changelog/post/2026-06-05-union-intersect-except-select-distinct/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-05-union-intersect-except-select-distinct/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; now supports set operations (&lt;code&gt;UNION&lt;/code&gt;, &lt;code&gt;INTERSECT&lt;/code&gt;, &lt;code&gt;EXCEPT&lt;/code&gt;) and &lt;code&gt;SELECT DISTINCT&lt;/code&gt;, expanding the range of analytical queries you can run directly on &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Set operations&lt;/h4&gt;
&lt;p&gt;Combine the results of multiple &lt;code&gt;SELECT&lt;/code&gt; statements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;UNION&lt;/code&gt;&lt;/strong&gt; — returns all rows from both queries, removing duplicates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;UNION ALL&lt;/code&gt;&lt;/strong&gt; — returns all rows from both queries, including duplicates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;INTERSECT&lt;/code&gt;&lt;/strong&gt; — returns only rows that appear in both queries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;EXCEPT&lt;/code&gt;&lt;/strong&gt; — returns rows from the first query that do not appear in the second&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Find zones that had either firewall blocks OR high-risk requests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; zone_id &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.firewall_events &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;action&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;block&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;UNION&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; zone_id &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.http_requests &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; risk_score &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Find zones with both firewall blocks AND high traffic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; zone_id &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.firewall_events &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;action&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;block&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;INTERSECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; zone_id &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.http_requests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; zone_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Find enterprise zones that have not been compacted&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; zone_id &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.zones &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; plan &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;enterprise&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;EXCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; zone_id &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.compaction_history&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Select distinct&lt;/h4&gt;
&lt;p&gt;Eliminate duplicate rows from query results:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT DISTINCT&lt;/span&gt;&lt;span&gt; region, department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; total_amount &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; region, department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For large datasets where approximate results are acceptable, &lt;code&gt;approx_distinct()&lt;/code&gt; remains a faster alternative for counting unique values.&lt;/p&gt;
&lt;p&gt;For the full syntax reference, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For performance guidance, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - R2 SQL pricing announced</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-r2-sql-pricing-announced/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-r2-sql-pricing-announced/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; is a serverless, distributed query engine that runs SQL against &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. R2 SQL now has published pricing based on a single dimension: the volume of compressed data scanned to execute your queries. At $2.50 / TB ($0.0025 / GB), R2 SQL is priced at half the cost of AWS Athena and less than half of Google BigQuery on-demand.&lt;/p&gt;
&lt;p&gt;Billing is not yet enabled. We will provide at least 30 days notice before we start charging for R2 SQL usage.&lt;/p&gt;
&lt;p&gt;Data scanned is measured on compressed bytes read from R2 object storage. This matches what you see in your R2 bucket — if a Parquet file is 100 MB on disk, scanning that file bills for 100 MB. Each query has a minimum billing increment of 10 MB.&lt;/p&gt;
&lt;p&gt;Free plans include 1 GB / month and Paid plans include 10 GB / month. Standard &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/&quot;&gt;R2 storage and operations&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog&lt;/a&gt; charges apply separately.&lt;/p&gt;
&lt;p&gt;For full pricing details and billing examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/platform/pricing/&quot;&gt;R2 SQL pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - R2 SQL now supports JOINs, subqueries, and multi-table queries</title><link>https://developers.cloudflare.com/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; is Cloudflare&apos;s serverless, distributed SQL engine for querying &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. R2 SQL runs directly on Cloudflare&apos;s global network with no infrastructure to manage, so you can analyze data in R2 without exporting it to an external warehouse.&lt;/p&gt;
&lt;p&gt;R2 SQL now supports joining multiple Iceberg tables in a single query. You can combine tables with JOINs, filter with subqueries, and define multi-table CTEs to build complex analytical queries.&lt;/p&gt;
&lt;h4&gt;New capabilities&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JOINs&lt;/strong&gt; — &lt;code&gt;INNER JOIN&lt;/code&gt;, &lt;code&gt;LEFT JOIN&lt;/code&gt;, &lt;code&gt;RIGHT JOIN&lt;/code&gt;, &lt;code&gt;FULL OUTER JOIN&lt;/code&gt;, &lt;code&gt;CROSS JOIN&lt;/code&gt;, and implicit joins (comma-separated &lt;code&gt;FROM&lt;/code&gt; with conditions in &lt;code&gt;WHERE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subqueries&lt;/strong&gt; — &lt;code&gt;IN&lt;/code&gt; / &lt;code&gt;NOT IN&lt;/code&gt;, &lt;code&gt;EXISTS&lt;/code&gt; / &lt;code&gt;NOT EXISTS&lt;/code&gt;, scalar subqueries in &lt;code&gt;SELECT&lt;/code&gt; / &lt;code&gt;WHERE&lt;/code&gt; / &lt;code&gt;HAVING&lt;/code&gt;, and derived tables (subqueries in &lt;code&gt;FROM&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-table CTEs&lt;/strong&gt; — &lt;code&gt;WITH&lt;/code&gt; clauses can reference different tables and include JOINs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-joins&lt;/strong&gt; — join a table with itself using different aliases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-way joins&lt;/strong&gt; — join three or more tables in a single query&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Examples&lt;/h4&gt;
&lt;h4&gt;Two-table JOIN with aggregation&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; z.domain, z.plan, &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; request_count&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.zones z&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;INNER JOIN&lt;/span&gt;&lt;span&gt; my_namespace.http_requests h &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt; z.zone_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; h.zone_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; z.plan &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;enterprise&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; z.domain, z.plan&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; request_count &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;&lt;code&gt;EXISTS&lt;/code&gt; subquery&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; z.domain, z.plan&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.zones z&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EXISTS&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.firewall_events f&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; f.zone_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; z.zone_id &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; f.action &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;block&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; z.domain&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Multi-table CTE with JOIN&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WITH&lt;/span&gt;&lt;span&gt; top_zones &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; zone_id, &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; req_count&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.http_requests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; zone_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; req_count &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;zone_threats &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; zone_id, &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; threat_count&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.firewall_events&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; risk_score &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; zone_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; tz.zone_id, tz.req_count, &lt;/span&gt;&lt;span&gt;COALESCE&lt;/span&gt;&lt;span&gt;(zt.threat_count, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; threat_count&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; top_zones tz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LEFT JOIN&lt;/span&gt;&lt;span&gt; zone_threats zt &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt; tz.zone_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; zt.zone_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; tz.req_count &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For the full syntax reference, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For performance guidance with joins, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - R2 SQL adds JSON functions, EXPLAIN FORMAT JSON, and unpartitioned table support</title><link>https://developers.cloudflare.com/changelog/post/2026-04-20-r2-sql-json-functions-explain-format/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-20-r2-sql-json-functions-explain-format/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; is Cloudflare&apos;s serverless, distributed, analytics query engine for querying &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;R2 SQL now supports functions for querying JSON data stored in Apache Iceberg tables, an easier way to parse query plans with &lt;code&gt;EXPLAIN FORMAT JSON&lt;/code&gt;, and querying tables without partition keys stored in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;JSON functions extract and manipulate JSON values directly in SQL without client-side processing:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;json_get_str(doc, &lt;/span&gt;&lt;span&gt;&apos;name&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;json_get_int(doc, &lt;/span&gt;&lt;span&gt;&apos;user&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;profile&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;level&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;level&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;json_get_bool(doc, &lt;/span&gt;&lt;span&gt;&apos;active&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; is_active&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; json_contains(doc, &lt;/span&gt;&lt;span&gt;&apos;email&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For a full list of available functions, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/scalar-functions/#json-functions&quot;&gt;JSON functions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;EXPLAIN FORMAT JSON&lt;/code&gt; returns query execution plans as structured JSON for programmatic analysis and observability integrations:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;WAREHOUSE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;EXPLAIN FORMAT JSON SELECT * FROM logpush.requests LIMIT 10;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;┌──────────────────────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;plan&lt;/span&gt;&lt;span&gt;                                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;&quot;name&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;CoalescePartitionsExec&quot;,&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;&quot;output_partitions&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1,&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;&quot;rows&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;&quot;size_approx&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;310B&quot;,&lt;/span&gt;&lt;span&gt;             &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;&quot;children&quot;:&lt;/span&gt;&lt;span&gt; [                      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;name&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;DataSourceExec&quot;,&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;output_partitions&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4,&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;rows&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;28951,&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;size_approx&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;900.0KB&quot;,&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;table&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;logpush.requests&quot;,&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;files&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;7,&lt;/span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;bytes&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;900019,&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;projection&quot;:&lt;/span&gt;&lt;span&gt; [                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;__ingest_ts&quot;,&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;CPUTimeMs&quot;,&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;DispatchNamespace&quot;,&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;Entrypoint&quot;,&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;Event&quot;,&lt;/span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;EventTimestampMs&quot;,&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;EventType&quot;,&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;Exceptions&quot;,&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;Logs&quot;,&lt;/span&gt;&lt;span&gt;                      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;Outcome&quot;,&lt;/span&gt;&lt;span&gt;                   &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;ScriptName&quot;,&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;ScriptTags&quot;,&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;ScriptVersion&quot;,&lt;/span&gt;&lt;span&gt;             &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;WallTimeMs&quot;&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;limit&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;                                  &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└──────────────────────────────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/#explain&quot;&gt;EXPLAIN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Unpartitioned Iceberg tables can now be queried directly, which is useful for smaller datasets or data without natural time dimensions. For tables with more than 1000 files, partitioning is still recommended for better performance.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt; for the latest guidance on using R2 SQL.&lt;/p&gt;</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - R2 SQL now supports over 190 new functions, expressions, and complex types</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; now supports an expanded SQL grammar so you can write richer analytical queries without exporting data. This release adds CASE expressions, column aliases, arithmetic in clauses, 163 scalar functions, 33 aggregate functions, EXPLAIN, Common Table Expressions (CTEs),and full struct/array/map access. R2 SQL is Cloudflare&apos;s serverless, distributed, analytics query engine for querying &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. This page documents the supported SQL syntax.&lt;/p&gt;
&lt;h4&gt;Highlights&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Column aliases&lt;/strong&gt; — &lt;code&gt;SELECT col AS alias&lt;/code&gt; now works in all clauses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CASE expressions&lt;/strong&gt; — conditional logic directly in SQL (searched and simple forms)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalar functions&lt;/strong&gt; — 163 new functions across math, string, datetime, regex, crypto, encoding, and type inspection categories&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggregate functions&lt;/strong&gt; — statistical (variance, stddev, correlation, regression), bitwise, boolean, and positional aggregates join the existing basic and approximate functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex types&lt;/strong&gt; — query struct fields with bracket notation, use 46 array functions, and extract map keys/values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Common table expressions (CTEs)&lt;/strong&gt; — use &lt;code&gt;WITH ... AS&lt;/code&gt; to define named temporary result sets. Chained CTEs are supported. All CTEs must reference the same single table.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full expression support&lt;/strong&gt; — arithmetic, type casting (&lt;code&gt;CAST&lt;/code&gt;, &lt;code&gt;TRY_CAST&lt;/code&gt;, &lt;code&gt;::&lt;/code&gt; shorthand), and &lt;code&gt;EXTRACT&lt;/code&gt; in SELECT, WHERE, GROUP BY, HAVING, and ORDER BY&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Examples&lt;/h4&gt;
&lt;h4&gt;CASE expressions with statistical aggregates&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; source,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;CASE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(price) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;premium&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(price) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;mid-tier&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;ELSE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;budget&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;END&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; tier,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;(stddev(price), &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; price_volatility,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(price, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;95&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; p95_price&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; source&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Struct and array access&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; product_name,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pricing[&apos;price&apos;] &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; price,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;array_to_string(tags, &lt;/span&gt;&lt;span&gt;&apos;, &apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; tag_list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.products&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; array_has(tags, &lt;/span&gt;&lt;span&gt;&apos;Action&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; pricing[&apos;price&apos;] &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Chained CTEs with time-series analysis&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WITH&lt;/span&gt;&lt;span&gt; monthly &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; date_trunc(&lt;/span&gt;&lt;span&gt;&apos;month&apos;&lt;/span&gt;&lt;span&gt;, sale_timestamp) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;month&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;department,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; transactions,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(total_amount), &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; avg_amount&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; sale_timestamp &lt;/span&gt;&lt;span&gt;BETWEEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;2025-01-01T00:00:00Z&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;2025-12-31T23:59:59Z&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; date_trunc(&lt;/span&gt;&lt;span&gt;&apos;month&apos;&lt;/span&gt;&lt;span&gt;, sale_timestamp), department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ranked &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;month&lt;/span&gt;&lt;span&gt;, department, transactions, avg_amount,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;CASE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;span&gt; avg_amount &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;high-value&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;span&gt; avg_amount &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;mid-value&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;ELSE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;standard&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;END&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; tier&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; monthly&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; transactions &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; ranked&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;month&lt;/span&gt;&lt;span&gt;, avg_amount &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For the full function reference and syntax details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For limitations and best practices, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - R2 SQL now supports approximate aggregation functions</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-approximate-aggregation-functions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-approximate-aggregation-functions/</guid><description>&lt;p&gt;R2 SQL now supports five approximate aggregation functions for fast analysis of large datasets. These functions trade minor precision for improved performance on high-cardinality data.&lt;/p&gt;
&lt;h4&gt;New functions&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;APPROX_PERCENTILE_CONT(column, percentile)&lt;/code&gt; — Returns the approximate value at a given percentile (0.0 to 1.0). Works on integer and decimal columns.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_PERCENTILE_CONT_WITH_WEIGHT(column, weight, percentile)&lt;/code&gt; — Weighted percentile calculation where each row contributes proportionally to its weight column value.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_MEDIAN(column)&lt;/code&gt; — Returns the approximate median. Equivalent to &lt;code&gt;APPROX_PERCENTILE_CONT(column, 0.5)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_DISTINCT(column)&lt;/code&gt; — Returns the approximate number of distinct values. Works on any column type.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_TOP_K(column, k)&lt;/code&gt; — Returns the &lt;code&gt;k&lt;/code&gt; most frequent values with their counts as a JSON array.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All functions support &lt;code&gt;WHERE&lt;/code&gt; filters. All except &lt;code&gt;APPROX_TOP_K&lt;/code&gt; support &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Examples&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Percentile analysis on revenue data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(total_amount, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;25&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(total_amount, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(total_amount, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;75&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Median per department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; department, approx_median(total_amount)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Approximate distinct customers by region&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; region, approx_distinct(customer_id)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; region&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Top 5 most frequent departments&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; approx_top_k(department, &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Combine approximate and standard aggregations&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(total_amount),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(total_amount, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;approx_distinct(customer_id)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; region &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;North&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For the full syntax and additional examples, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - R2 SQL now supports aggregations and schema discovery</title><link>https://developers.cloudflare.com/changelog/post/2025-12-12-aggregation-support-and-more/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-12-aggregation-support-and-more/</guid><description>&lt;p&gt;R2 SQL now supports aggregation functions, &lt;code&gt;GROUP BY&lt;/code&gt;, &lt;code&gt;HAVING&lt;/code&gt;, along with schema discovery commands to make it easy to explore your data catalog.&lt;/p&gt;
&lt;h4&gt;Aggregation Functions&lt;/h4&gt;
&lt;p&gt;You can now perform aggregations on Apache Iceberg tables in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; using standard SQL functions including &lt;code&gt;COUNT(*)&lt;/code&gt;, &lt;code&gt;SUM()&lt;/code&gt;, &lt;code&gt;AVG()&lt;/code&gt;, &lt;code&gt;MIN()&lt;/code&gt;, and &lt;code&gt;MAX()&lt;/code&gt;. Combine these with &lt;code&gt;GROUP BY&lt;/code&gt; to analyze data across dimensions, and use &lt;code&gt;HAVING&lt;/code&gt; to filter aggregated results.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Calculate average transaction amounts by department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; department, &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(total_amount)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; region &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;North&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(total_amount) &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Find high-value departments&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; department, &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt;(total_amount)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt;(total_amount) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;50000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Schema Discovery&lt;/h4&gt;
&lt;p&gt;New metadata commands make it easy to explore your data catalog and understand table structures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SHOW DATABASES&lt;/code&gt; or &lt;code&gt;SHOW NAMESPACES&lt;/code&gt; - List all available namespaces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SHOW TABLES IN namespace_name&lt;/code&gt; - List tables within a namespace&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DESCRIBE namespace_name.table_name&lt;/code&gt; - View table schema and column types&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;❯&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;{ACCOUNT_ID}_{BUCKET_NAME}&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;DESCRIBE default.sales_data;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;⛅️&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4.54.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;─────────────────────────────────────────────&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;┌──────────────────┬────────────────┬──────────┬─────────────────┬───────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column_name&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;initial_default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;write_default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;doc&lt;/span&gt;&lt;span&gt;                                                                                               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale_id&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BIGINT&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;identifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;each&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sales&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;transaction&lt;/span&gt;&lt;span&gt;                                                      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale_timestamp&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TIMESTAMPTZ&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;occurred&lt;/span&gt;&lt;span&gt; (used &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;partitioning&lt;/span&gt;&lt;span&gt;)                                │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;department&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;department&lt;/span&gt;&lt;span&gt; (8 &lt;/span&gt;&lt;span&gt;categories:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Electronics,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Beauty,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Home,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Toys,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sports,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Food,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Clothing,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Books&lt;/span&gt;&lt;span&gt;) │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;grouping&lt;/span&gt;&lt;span&gt; (4 &lt;/span&gt;&lt;span&gt;categories:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Premium,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Standard,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Budget,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Clearance&lt;/span&gt;&lt;span&gt;)                    │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;region&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Geographic&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sales&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;region&lt;/span&gt;&lt;span&gt; (5 &lt;/span&gt;&lt;span&gt;regions:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;North,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;South,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;East,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;West,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Central&lt;/span&gt;&lt;span&gt;)                            │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;product_id&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;identifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sold&lt;/span&gt;&lt;span&gt;                                                            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Number&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;units&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sold&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;transaction&lt;/span&gt;&lt;span&gt; (range: &lt;/span&gt;&lt;span&gt;1-50&lt;/span&gt;&lt;span&gt;)                                            │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unit_price&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DECIMAL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Price&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;per&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dollars&lt;/span&gt;&lt;span&gt; (range: &lt;/span&gt;&lt;span&gt;$5&lt;/span&gt;&lt;span&gt;.00-&lt;/span&gt;&lt;span&gt;$500&lt;/span&gt;&lt;span&gt;.00&lt;/span&gt;&lt;span&gt;)                                                  │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;total_amount&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DECIMAL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Total&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;before&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tax&lt;/span&gt;&lt;span&gt; (quantity &lt;/span&gt;&lt;span&gt;×&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unit_price&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;discounts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;applied&lt;/span&gt;&lt;span&gt;)                       │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;discount_percent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Discount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;percentage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;applied&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; (0-50%)                                                  │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tax_amount&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DECIMAL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Tax&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;collected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt;                                                                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profit_margin&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DECIMAL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Profit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;margin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;decimal&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;percentage&lt;/span&gt;&lt;span&gt;                                                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;customer_id&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;identifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;customer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;who&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;made&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;purchase&lt;/span&gt;&lt;span&gt;                                          &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is_online_sale&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BOOLEAN&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;indicating&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;was&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;made&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;online&lt;/span&gt;&lt;span&gt; (true) or in-store (&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;)                        │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale_date&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DATE&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Calendar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; (extracted &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale_timestamp&lt;/span&gt;&lt;span&gt;)                                         │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└──────────────────┴────────────────┴──────────┴─────────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Read&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;across&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;files&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;On&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;average,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To learn more about the new aggregation capabilities and schema discovery commands, check out the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. If you&apos;re new to R2 SQL, visit our &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/get-started/&quot;&gt;getting started guide&lt;/a&gt; to begin querying your data.&lt;/p&gt;</description><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - Announcing R2 SQL</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-announcing-r2-sql-open-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-announcing-r2-sql-open-beta/</guid><description>&lt;p&gt;Today, we&apos;re launching the &lt;strong&gt;open beta&lt;/strong&gt; for &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt;: A serverless, distributed query engine that can efficiently analyze petabytes of data in &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables managed by &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;R2 SQL is ideal for exploring analytical and time-series data stored in R2, such as logs, events from &lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Pipelines&lt;/a&gt;, or clickstream and user behavior data.&lt;/p&gt;
&lt;p&gt;If you already have a table in R2 Data Catalog, running queries is as simple as:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;YOUR_WAREHOUSE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;user_id,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;event_type,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM events.user_events&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE event_type = &apos;CHANGELOG&apos; or event_type = &apos;BLOG&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AND __ingest_ts &gt; &apos;2025-09-24T00:00:00Z&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY __ingest_ts DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LIMIT 100&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To get started with R2 SQL, check out our &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/get-started/&quot;&gt;getting started guide&lt;/a&gt; or learn more about supported features in the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For a technical deep dive into how we built R2 SQL, read our &lt;a href=&quot;https://blog.cloudflare.com/r2-sql-deep-dive/&quot; target=&quot;_blank&quot;&gt;blog post&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 13:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item></channel></rss>