最新版PostgreSQLバージョン8.4の機能

SQL言語の拡張(1)ウィンドウ関数のサポート 2009年7月に、およそ1年半ぶりのメジャーバージョンアップとなるPostgreSQLバージョン8.4がリリースされました。本記事執筆時点(2009年10月)ですでに、いくつかのバグ修正が適用された8.4.1がリリースされています。実稼働システムでの採

高塚 遙(たかつか はるか)

2009年10月16日 20:00

SQL言語の拡張(1)ウィンドウ関数のサポート

 2009年7月に、およそ1年半ぶりのメジャーバージョンアップとなるPostgreSQLバージョン8.4がリリースされました。本記事執筆時点(2009年10月)ですでに、いくつかのバグ修正が適用された8.4.1がリリースされています。実稼働システムでの採用はこれから始まるといった段階です。

 バージョン8.4は、性能アップというよりは機能アップに重点のおかれたリリースです。例えば、SQLで新たに重要な構文がいくつかサポートされました。また、運用担当者向けに、実務上の要望にこたえる機能追加がされています。今回は、バージョン8.4の新機能について紹介します。

 新たに追加された機能の1つが、ウィンドウ関数です。ウィンドウ関数とは、集計をより柔軟に行うものであり、商用データベース製品にはあって、長らくPostgreSQLには無かった機能です。例えば、以下のようなテーブル

---------------------------------------------------
=# SELECT * FROM t_shopsale;

店舗ID | 形態 | 地域 | 年月 | 売上
--------+------+------+------------+------
101 | 駅前 | 九州 | 2009-04-30 | 6258
102 | 郊外 | 関東 | 2009-04-30 | 7352
103 | 駅前 | 東海 | 2009-04-30 | 4265
104 | 郊外 | 関東 | 2009-04-30 | 8901
(以下省略)
---------------------------------------------------

 では、次のようにOVER句を使って、店舗ID順に並べたまま、複数の分類項目ごとの合計や順位を、各店舗の行ごとに出力することができます。表計算ソフトのような集計技法が、SQLにおける1つの表で可能になったと言えます。ただし、集計分析用の機能の中でも、ROLLUPやCUBEなどの構文は、いまだサポートされていません。

---------------------------------------------------
=# SELECT "店舗ID", "形態", "地域", "売上",
sum("売上") OVER (PARTITION BY "地域") AS "地域計",
rank() OVER (ORDER BY "売上" DESC),
rank() OVER (PARTITION BY "形態" ORDER BY "売上" DESC) AS "形態別",
rank() OVER (PARTITION BY "地域" ORDER BY "売上" DESC) AS "地域別"
FROM t_shopsale WHERE "年月" = '2009-04-30' ORDER BY "店舗ID";

店舗ID | 形態 | 地域 | 売上 | 地域計 | rank | 形態別 | 地域別
--------+------+------+------+--------+------+--------+--------
101 | 駅前 | 九州 | 6258 | 127070 | 44 | 23 | 9
102 | 郊外 | 関東 | 7352 | 165516 | 33 | 17 | 10
103 | 駅前 | 東海 | 4265 | 146342 | 72 | 37 | 19
104 | 郊外 | 関東 | 8901 | 165516 | 14 | 10 | 4
(以下省略)
---------------------------------------------------

SQL言語の拡張(2)WITH構文による再帰結合

 バージョン8.4ではまた、WITH句による再帰結合の構文がサポートされました。図1のデータを表現する、以下のようなテーブル

---------------------------------------------------
=# SELECT * FROM t_section ;

組織ID | 組織名 | 上位組織
--------+------------+----------
1 | 取締役会 |
2 | 営業本部 | 1
3 | 法人営業部 | 2
(以下省略)
---------------------------------------------------

を、次のように結合できます。

---------------------------------------------------
=# WITH RECURSIVE r ("組織ID", "組織名", "上位ライン") AS
(SELECT "組織ID", "組織名", '{}'::TEXT[] FROM t_section WHERE "上位組織" IS NULL
UNION ALL
SELECT s."組織ID", s."組織名", ARRAY[r."組織名"] || r."上位ライン"
FROM t_section s JOIN r ON (s."上位組織" = r."組織ID")
) SELECT * FROM r;

組織ID | 組織名 | 上位ライン
--------+------------+---------------------
1 | 取締役会 | {}
2 | 営業本部 | {取締役会}
6 | 生産本部 | {取締役会}
10 | 企画室 | {取締役会}
3 | 法人営業部 | {営業本部,取締役会}
4 | 個人営業部 | {営業本部,取締役会}
(以下省略)
---------------------------------------------------

 WITH句は、その後に続くSQLによってビューのように参照される、一時的なテーブルを定義するものです。そこで「WITH RECURSIVE」と指定すると、自分自身と結合するSELECT文を、UNION ALLの後に記述することができます。これにより、再帰的にテーブルを手繰るようなSELECT文を記述することができます。なお、この例では、「上位ライン」カラムにTEXTの配列データ型を使っています。

この記事のキーワード :

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30