# R2 SQL がウィンドウ関数と集合演算に対応したよ！

やっほー、しぃちゃんだよ！今日は R2 SQL に、分析クエリ好きにはたまらないアップデートが来たから紹介するね。

## なにが発表されたの？

Cloudflare の Changelog によると、サーバーレスな SQL エンジン [R2 SQL](https://developers.cloudflare.com/r2-sql/) が、ウィンドウ関数・DISTINCT・集合演算に対応したの。[Apache Iceberg](https://iceberg.apache.org/) のテーブルに対して、外部の前処理なしでこういう分析クエリを直接書けるようになったんだよ。

## 今までどうだったの？

これまでの R2 SQL でも Iceberg のデータを問い合わせできたけど、行にランキングを付けたり重複を除いたり、2 つの結果をくっつけたり引いたりといった一歩踏み込んだ分析は、別のツールや前処理に頼る場面が多かったの。今回のアップデートで、その手の定番クエリが R2 SQL の中だけで完結するようになったよ。

## これで何が変わるの？

リージョンごとの売上ランキングみたいな集計が、1 本の SQL でスッと書けるようになるの。たとえばウィンドウ関数を使うとこんな感じ。

```sql
SELECT customer_id, region,
       ROW_NUMBER() OVER (PARTITION BY region ORDER BY total_amount DESC) AS rank_in_region
FROM my_namespace.sales_data
```

2 つのテーブルの差分を取りたいときは、集合演算の EXCEPT が便利だよ。

```sql
SELECT customer_id FROM my_namespace.sales_data
EXCEPT
SELECT customer_id FROM my_namespace.archived_sales
```

## 深く潜ってみよう

今回そろった機能を並べてみるね。

- ウィンドウ関数: ROW_NUMBER, RANK, DENSE_RANK, PERCENT_RANK, CUME_DIST, NTILE, LAG, LEAD, FIRST_VALUE, LAST_VALUE, NTH_VALUE
- ウィンドウ関数の結果を絞り込む QUALIFY 句
- SELECT DISTINCT と DISTINCT ON (...) 構文
- 集合演算: UNION, UNION ALL, INTERSECT, EXCEPT
- グルーピング拡張: GROUPING SETS, ROLLUP, CUBE
- 正確な集約: MEDIAN, PERCENTILE_CONT, ARRAY_AGG, STRING_AGG

使える構文の詳しいところは [SQL リファレンス](https://developers.cloudflare.com/r2-sql/sql-reference/) に載っているし、クエリを書く前に [制限事項とベストプラクティス](https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/) に目を通しておくと安心だよ。データの置き場所まわりは [R2 Data Catalog](https://developers.cloudflare.com/r2/data-catalog/) と合わせて見てみてね。

## まとめ

- R2 SQL がウィンドウ関数・DISTINCT・集合演算に対応したよ
- QUALIFY 句や GROUPING SETS, ROLLUP, CUBE、MEDIAN などの正確な集約も追加
- Apache Iceberg テーブルへ前処理なしで分析クエリを直接書ける

R2 に貯めたデータをそのまま分析したい人や、外部の変換パイプラインを減らしたい人にうれしいアップデートだね。
