<?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.stormtrust.net/changelog/</link><item><title>R2 SQL - Billing is now enabled for R2 SQL</title><link>https://developers.stormtrust.net/changelog/post/2026-08-03-r2-sql-billing-enabled/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-08-03-r2-sql-billing-enabled/</guid><description>&lt;p&gt;Billing is now enabled for &lt;a href=&quot;https://developers.stormtrust.net/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; on non-enterprise accounts. R2 SQL usage beyond the included free tier will appear on your next invoice.&lt;/p&gt;
&lt;p&gt;R2 SQL charges based on a single dimension:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data scanned&lt;/strong&gt;: $0.0025 / GB ($2.50 / TB) of compressed data read from R2 to execute your query.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All plans include 10 GB of data scanned per month. Each query is billed for a minimum of 10 MB of data scanned. R2 SQL pricing is additive to standard &lt;a href=&quot;https://developers.stormtrust.net/r2/pricing/&quot;&gt;R2 storage and operations&lt;/a&gt; and &lt;a href=&quot;https://developers.stormtrust.net/r2-data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog&lt;/a&gt; charges. R2 does not charge for egress, so there is no additional data transfer cost.&lt;/p&gt;
&lt;p&gt;For example, a user who stores 500 GB of Parquet data in R2 Data Catalog and runs queries that scan a total of 50 GB of compressed data during the month would be billed as follows:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Billable&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R2 storage&lt;/td&gt;
&lt;td&gt;500 GB-month&lt;/td&gt;
&lt;td&gt;10 GB-month&lt;/td&gt;
&lt;td&gt;490 GB-month&lt;/td&gt;
&lt;td&gt;$7.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2 SQL (data scanned)&lt;/td&gt;
&lt;td&gt;50 GB&lt;/td&gt;
&lt;td&gt;10 GB&lt;/td&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$7.45&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;For full pricing details and billing examples, refer to &lt;a href=&quot;https://developers.stormtrust.net/r2-sql/platform/pricing/&quot;&gt;R2 SQL pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - Query R2 Data Catalog tables with R2 SQL from the dashboard</title><link>https://developers.stormtrust.net/changelog/post/2026-07-08-query-r2-sql-from-dashboard/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-07-08-query-r2-sql-from-dashboard/</guid><description>
&lt;p&gt;You can now query your &lt;a href=&quot;https://developers.stormtrust.net/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; tables with &lt;a href=&quot;https://developers.stormtrust.net/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; directly from the Cloudflare dashboard, without installing a CLI or wiring up a client. This makes it easy to explore your &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; data, validate queries, and inspect results in one place.&lt;/p&gt;
&lt;img src=&quot;https://developers.stormtrust.net/cdn-cgi/image/onerror=redirect,width=3080,height=1696,format=webp/_astro/r2-sql-studio.DCmHJaqy.png&quot; alt=&quot;R2 SQL Query Editor&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3080&quot; height=&quot;1696&quot;&gt;
&lt;p&gt;To get started, go to &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/data-catalog/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;R2 Data Catalog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; in the Cloudflare dashboard and select &lt;strong&gt;Query data&lt;/strong&gt; to launch the built-in SQL editor. From there you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Write and run queries interactively&lt;/strong&gt; — Iterate on R2 SQL directly in the browser with syntax highlighting and autocomplete, instead of re-running commands through Wrangler or the REST API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explore your data&lt;/strong&gt; — Explore your namespaces and tables alongside the editor so you can discover what&apos;s queryable without leaving the page or using other tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understand results and performance&lt;/strong&gt; — View result sets with per-query statistics, export them, and get helpful &lt;code&gt;EXPLAIN&lt;/code&gt; outputs to see exactly how a query runs.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Your R2 SQL credential is generated and stored for you and can be rotated in the R2 Data Catalog settings page.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - R2 SQL now supports window functions, DISTINCT, and set operations</title><link>https://developers.stormtrust.net/changelog/post/2026-06-21-window-functions-distinct-set-operations/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-06-21-window-functions-distinct-set-operations/</guid><description>&lt;p&gt;R2 SQL now supports window functions, &lt;code&gt;SELECT DISTINCT&lt;/code&gt;, set operations, and additional aggregates, making it easier to write analytical queries without preprocessing your data elsewhere.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/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; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.stormtrust.net/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-capabilities&quot;&gt;New capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Window functions&lt;/strong&gt; — &lt;code&gt;ROW_NUMBER&lt;/code&gt;, &lt;code&gt;RANK&lt;/code&gt;, &lt;code&gt;DENSE_RANK&lt;/code&gt;, &lt;code&gt;PERCENT_RANK&lt;/code&gt;, &lt;code&gt;CUME_DIST&lt;/code&gt;, &lt;code&gt;NTILE&lt;/code&gt;, &lt;code&gt;LAG&lt;/code&gt;, &lt;code&gt;LEAD&lt;/code&gt;, &lt;code&gt;FIRST_VALUE&lt;/code&gt;, &lt;code&gt;LAST_VALUE&lt;/code&gt;, &lt;code&gt;NTH_VALUE&lt;/code&gt;, and aggregates with an &lt;code&gt;OVER (...)&lt;/code&gt; clause, including &lt;code&gt;PARTITION BY&lt;/code&gt; and explicit frames&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QUALIFY&lt;/strong&gt; — filter rows based on a window function result&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DISTINCT&lt;/strong&gt; — &lt;code&gt;SELECT DISTINCT&lt;/code&gt;, &lt;code&gt;DISTINCT ON (...)&lt;/code&gt;, and the &lt;code&gt;DISTINCT&lt;/code&gt; modifier on aggregates such as &lt;code&gt;COUNT(DISTINCT ...)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set operations&lt;/strong&gt; — &lt;code&gt;UNION&lt;/code&gt;, &lt;code&gt;UNION ALL&lt;/code&gt;, &lt;code&gt;INTERSECT&lt;/code&gt;, and &lt;code&gt;EXCEPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grouping extensions&lt;/strong&gt; — &lt;code&gt;GROUPING SETS&lt;/code&gt;, &lt;code&gt;ROLLUP&lt;/code&gt;, and &lt;code&gt;CUBE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exact aggregates&lt;/strong&gt; — &lt;code&gt;MEDIAN&lt;/code&gt;, &lt;code&gt;PERCENTILE_CONT&lt;/code&gt;, &lt;code&gt;ARRAY_AGG&lt;/code&gt;, and &lt;code&gt;STRING_AGG&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;rank-rows-with-a-window-function&quot;&gt;Rank rows with a window function&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rank-rows-with-a-window-function&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id, region,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       ROW_NUMBER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;OVER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;PARTITION&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; rank_in_region&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;filter-with-qualify&quot;&gt;Filter with QUALIFY&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#filter-with-qualify&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id, region, total_amount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;QUALIFY &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;ROW_NUMBER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;OVER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;PARTITION&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;combine-tables-with-a-set-operation&quot;&gt;Combine tables with a set operation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#combine-tables-with-a-set-operation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;EXCEPT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;archived_sales&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The named &lt;code&gt;WINDOW&lt;/code&gt; clause is not supported — inline the &lt;code&gt;OVER (...)&lt;/code&gt; specification at each call site. For the full syntax reference, refer to the &lt;a href=&quot;https://developers.stormtrust.net/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For supported features and performance guidance, refer to &lt;a href=&quot;https://developers.stormtrust.net/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 SQL - R2 SQL now supports UNION, INTERSECT, EXCEPT, and SELECT DISTINCT</title><link>https://developers.stormtrust.net/changelog/post/2026-06-05-union-intersect-except-select-distinct/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-06-05-union-intersect-except-select-distinct/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/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; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables in &lt;a href=&quot;https://developers.stormtrust.net/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;set-operations&quot;&gt;Set operations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#set-operations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&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;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find zones that had either firewall blocks OR high-risk requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;UNION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; risk_score &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find zones with both firewall blocks AND high traffic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;INTERSECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find enterprise zones that have not been compacted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; plan &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;enterprise&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;EXCEPT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;compaction_history&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;select-distinct&quot;&gt;Select distinct&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#select-distinct&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Eliminate duplicate rows from query results:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT DISTINCT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region, department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region, department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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.stormtrust.net/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For performance guidance, refer to &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/changelog/post/2026-05-11-r2-sql-pricing-announced/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-05-11-r2-sql-pricing-announced/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/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; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.stormtrust.net/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;All plans include 10 GB of data scanned per month. Standard &lt;a href=&quot;https://developers.stormtrust.net/r2/pricing/&quot;&gt;R2 storage and operations&lt;/a&gt; and &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/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.stormtrust.net/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/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; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.stormtrust.net/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;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-capabilities&quot;&gt;New capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&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;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;two-table-join-with-aggregation&quot;&gt;Two-table JOIN with aggregation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#two-table-join-with-aggregation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;INNER JOIN&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; h &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ON&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; h&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;enterprise&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request_count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;exists-subquery&quot;&gt;&lt;code&gt;EXISTS&lt;/code&gt; subquery&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#exists-subquery&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; EXISTS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AND&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;multi-table-cte-with-join&quot;&gt;Multi-table CTE with JOIN&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#multi-table-cte-with-join&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WITH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; top_zones &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; req_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; req_count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;zone_threats &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; threat_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; risk_score &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;req_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;threat_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; threat_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; top_zones tz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LEFT JOIN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_threats zt &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ON&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; zt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;req_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the full syntax reference, refer to the &lt;a href=&quot;https://developers.stormtrust.net/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For performance guidance with joins, refer to &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/changelog/post/2026-04-20-r2-sql-json-functions-explain-format/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-04-20-r2-sql-json-functions-explain-format/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/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; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/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;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  json_get_str(doc, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  json_get_int(doc, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;user&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;profile&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;level&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; level&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  json_get_bool(doc, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;active&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; is_active&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; json_contains(doc, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;email&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For a full list of available functions, refer to &lt;a href=&quot;https://developers.stormtrust.net/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;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sql&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;WAREHOUSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;EXPLAIN FORMAT JSON SELECT * FROM logpush.requests LIMIT 10;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;┌──────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; plan&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;name&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;CoalescePartitionsExec&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;output_partitions&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 1,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;rows&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;size_approx&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;310B&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;             │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;children&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [                      &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;     {&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;name&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;DataSourceExec&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;output_partitions&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 4,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;rows&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 28951,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;size_approx&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;900.0KB&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;table&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;logpush.requests&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;files&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 7,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;bytes&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 900019,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;projection&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [                &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;__ingest_ts&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;CPUTimeMs&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;DispatchNamespace&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Entrypoint&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Event&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;EventTimestampMs&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;          │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;EventType&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Exceptions&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Logs&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Outcome&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;ScriptName&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;ScriptTags&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;ScriptVersion&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;             │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;WallTimeMs&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       ],&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                             │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;limit&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;     }&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   ]&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;└──────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/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.stormtrust.net/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/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; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.stormtrust.net/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. This page documents the supported SQL syntax.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;highlights&quot;&gt;Highlights&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#highlights&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&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;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;case-expressions-with-statistical-aggregates&quot;&gt;CASE expressions with statistical aggregates&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#case-expressions-with-statistical-aggregates&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; source,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    CASE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        WHEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(price) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; THEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;premium&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        WHEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(price) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; THEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;mid-tier&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        ELSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;budget&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    END&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tier,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    round&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stddev(price), &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; price_volatility,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(price, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; p95_price&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; source&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;struct-and-array-access&quot;&gt;Struct and array access&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#struct-and-array-access&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; product_name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    pricing[&apos;price&apos;] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; price,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    array_to_string(tags, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tag_list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;products&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; array_has(tags, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;Action&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; pricing[&apos;price&apos;] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;chained-ctes-with-time-series-analysis&quot;&gt;Chained CTEs with time-series analysis&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#chained-ctes-with-time-series-analysis&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WITH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; monthly &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; date_trunc(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;month&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, sale_timestamp) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; month&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        department,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; transactions,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        round&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount), &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; avg_amount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sale_timestamp &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;BETWEEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;2025-01-01T00:00:00Z&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AND&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;2025-12-31T23:59:59Z&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; date_trunc(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;month&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, sale_timestamp), department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ranked &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; month&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, department, transactions, avg_amount,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        CASE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;            WHEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; avg_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; THEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;high-value&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;            WHEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; avg_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 500&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; THEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;mid-value&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;            ELSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;standard&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        END&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; monthly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; transactions &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ranked&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; month&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, avg_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the full function reference and syntax details, refer to the &lt;a href=&quot;https://developers.stormtrust.net/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For limitations and best practices, refer to &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/changelog/post/2026-02-09-approximate-aggregation-functions/</link><guid isPermaLink="true">https://developers.stormtrust.net/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;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-functions&quot;&gt;New functions&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-functions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&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;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Percentile analysis on revenue data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;75&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Median per department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department, approx_median(total_amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Approximate distinct customers by region&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region, approx_distinct(customer_id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Top 5 most frequent departments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; approx_top_k(department, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Combine approximate and standard aggregations&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;       approx_distinct(customer_id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;North&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the full syntax and additional examples, refer to the &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/changelog/post/2025-12-12-aggregation-support-and-more/</link><guid isPermaLink="true">https://developers.stormtrust.net/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;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;aggregation-functions&quot;&gt;Aggregation Functions&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#aggregation-functions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can now perform aggregations on Apache Iceberg tables in &lt;a href=&quot;https://developers.stormtrust.net/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;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Calculate average transaction amounts by department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;North&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find high-value departments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; SUM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 50000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;schema-discovery&quot;&gt;Schema Discovery&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#schema-discovery&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&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;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sql&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;{ACCOUNT_ID}_{BUCKET_NAME}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;DESCRIBE default.sales_data;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ⛅️&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 4.54.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;─────────────────────────────────────────────&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;┌──────────────────┬────────────────┬──────────┬─────────────────┬───────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; column_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; required&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; initial_default&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; write_default&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; doc&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                                                               │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;          │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; BIGINT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Unique&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; identifier&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; each&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sales&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; transaction&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale_timestamp&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; TIMESTAMPTZ&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Exact&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; date&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; and&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; time&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; when&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; occurred&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (used &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; partitioning&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; department&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; TEXT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Product&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; department&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (8 &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;categories:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Electronics,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Beauty,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Home,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Toys,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Sports,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Food,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Clothing,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Books&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; category&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; TEXT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Product&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; category&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; grouping&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (4 &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;categories:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Premium,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Standard,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Budget,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Clearance&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; region&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; TEXT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Geographic&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sales&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; region&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (5 &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;regions:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; North,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; South,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; East,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; West,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Central&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; product_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Unique&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; identifier&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; product&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sold&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; quantity&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Number&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; units&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sold&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; transaction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (range: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;1-50&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; unit_price&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DECIMAL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Price&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; per&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; unit&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dollars&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (range: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$5&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.00-&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$500&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.00&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                                                  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; total_amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;     │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DECIMAL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Total&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; before&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; tax&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (quantity &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; unit_price&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; with&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; discounts&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; applied&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                       │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; discount_percent&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Discount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; percentage&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; applied&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (0-50%)                                                  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; tax_amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DECIMAL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Tax&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; collected&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; profit_margin&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DECIMAL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Profit&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; margin&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; decimal&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; percentage&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; customer_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Unique&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; identifier&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; customer&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; who&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; made&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; purchase&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                          │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; is_online_sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; BOOLEAN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Boolean&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flag&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; indicating&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; if&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; was&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; made&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; online&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (true) or in-store (&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale_date&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DATE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Calendar&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; date&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (extracted &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale_timestamp&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                                         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;└──────────────────┴────────────────┴──────────┴─────────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Read&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; B&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; across&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; files&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; R2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;On&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; average,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; B&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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.stormtrust.net/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.stormtrust.net/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.stormtrust.net/changelog/post/2025-09-25-announcing-r2-sql-open-beta/</link><guid isPermaLink="true">https://developers.stormtrust.net/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.stormtrust.net/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; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables managed by &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/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;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sql&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; YOUR_WAREHOUSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    user_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    event_type,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;FROM events.user_events&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;WHERE event_type = &apos;CHANGELOG&apos; or event_type = &apos;BLOG&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  AND __ingest_ts &amp;gt; &apos;2025-09-24T00:00:00Z&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;ORDER BY __ingest_ts DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;LIMIT 100&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To get started with R2 SQL, check out our &lt;a href=&quot;https://developers.stormtrust.net/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.stormtrust.net/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; rel=&quot;noopener&quot;&gt;blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&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>