ホームページ > データベース > mysql チュートリアル > PostgreSQL で行指向のデータを列指向のデータに動的に変換するにはどうすればよいですか?

PostgreSQL で行指向のデータを列指向のデータに動的に変換するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-20 22:38:13
オリジナル
765 人が閲覧しました

How Can I Dynamically Transform Row-Oriented Data into Column-Oriented Data in PostgreSQL?

PostgreSQL で行データを列データに動的に変換するための代替案: CASE および GROUP BYcrosstab 関数

PostgreSQL では、多くのユーザーが分析やレポート作成のために行データ テーブルを列データ テーブルに変換する必要があります。 CASEGROUP BY は一般的に使用されるメソッドですが、より動的で効率的な代替手段も存在します。

問題の説明

たとえば、次の表を考えてみましょう:

id feh bar
1 10 A
2 20 A
3 3 B
4 4 B
5 5 C
6 6 D
7 7 D
8 8 D

必要な出力 このデータを次の形式に変換します:

bar val1 val2 val3
A 10 20 NULL
B 3 4 NULL
C 5 NULL NULL
D 6 7 8

CASEGROUP BY

を使用した解決策

これを実現する 1 つの方法は、CASE および GROUP BY テクニックを使用することです。

<code class="language-sql">SELECT bar, 
   MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1",
   MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2",
   MAX(CASE WHEN abc."row" = 3 THEN feh ELSE NULL END) AS "val3"
FROM
(
  SELECT bar, feh, row_number() OVER (partition by bar) as row
  FROM "Foo"
 ) abc
GROUP BY bar </code>
ログイン後にコピー

このアプローチは機能しますが、柔軟性とパフォーマンスの点で潜在的な制限があります。

crosstab 機能: 動的ソリューション

PostgreSQL の

モジュールによって導入された tablefunc 関数は、より動的で効率的な代替手段です。 crosstab() 関数を使用すると、出力列を明示的に定義せずに、目的の変換を実現できます。 crosstab()

基本的な

ソリューションcrosstab

この問題例の基本的な

解決策は次のとおりです: crosstab

<code class="language-sql">SELECT * FROM crosstab(
  'SELECT bar, 1 AS cat, feh
   FROM   tbl_org
   ORDER  BY bar, feh')
 AS ct (bar text, val1 int, val2 int, val3 int);</code>
ログイン後にコピー
このクエリでは、

SELECT bar, 1 AS cat, feh と互換性のある形式でデータを提供します。 crosstab() 列は、テーブルにカテゴリ情報がないため、ダミーのプレースホルダーとして使用されます。 cat

高度な

ソリューションcrosstab

実際のカテゴリ列が存在する場合は、それを使用して結果内の値の順序を制御できます。次のクエリはこれを示しています:

<code class="language-sql">SELECT * FROM crosstab(
   $$
   SELECT bar, val, feh
   FROM  (
      SELECT *, 'val' || row_number() OVER (PARTITION BY bar ORDER BY feh) AS val
      FROM tbl_org
      ) x
   ORDER BY 1, 2
   $$
 , $$VALUES ('val1'), ('val2'), ('val3')$$         
) AS ct (bar text, val1 int, val2 int, val3 int);</code>
ログイン後にコピー
ニュース

crosstab

上記のソリューションは動的な列生成を提供しますが、PostgreSQL で異なる列を動的に返すことはさらに困難です。ただし、特定の制限の下では、

モジュールの組み込み機能を使用してこれを実現できます。 tablefunc

結論

関数は、crosstab() メソッドと CASE メソッドに代わる強力かつ動的な代替手段を提供します。これにより、柔軟なデータ変換が可能になり、PostgreSQL でのデータ操作のための貴重なツールになります。 GROUP BY

以上がPostgreSQL で行指向のデータを列指向のデータに動的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート