Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Mengubah Data Berorientasikan Baris Secara Dinamik kepada Data Berorientasikan Lajur dalam PostgreSQL?

Bagaimanakah Saya Boleh Mengubah Data Berorientasikan Baris Secara Dinamik kepada Data Berorientasikan Lajur dalam PostgreSQL?

Patricia Arquette
Lepaskan: 2025-01-20 22:38:13
asal
769 orang telah melayarinya

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

Alternatif untuk menukar data baris secara dinamik kepada data lajur dalam PostgreSQL: CASE dan GROUP BY lwn. crosstab fungsi

Dalam PostgreSQL, ramai pengguna perlu menukar jadual data baris kepada jadual data lajur untuk analisis dan pelaporan. Walaupun CASE dan GROUP BY ialah kaedah yang biasa digunakan, alternatif yang lebih dinamik dan cekap wujud.

Pernyataan Masalah

Sebagai contoh, pertimbangkan jadual berikut:

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

Output yang Diingini Tukarkan data ini kepada format berikut:

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

Penyelesaian menggunakan CASE dan GROUP BY

Satu cara untuk mencapai matlamat ini ialah menggunakan teknik CASE dan 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>
Salin selepas log masuk

Walaupun pendekatan ini berkesan, pendekatan ini mempunyai potensi had dari segi fleksibiliti dan prestasi.

crosstab Fungsi: penyelesaian dinamik

Fungsi

yang diperkenalkan oleh modul tablefunc dalam PostgreSQL ialah alternatif yang lebih dinamik dan cekap. Menggunakan fungsi crosstab(), anda boleh mencapai transformasi yang diingini tanpa mentakrifkan lajur output secara eksplisit. crosstab()

Asas

Penyelesaiancrosstab

Untuk contoh masalah, penyelesaian asas

adalah seperti berikut: 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>
Salin selepas log masuk
Dalam pertanyaan ini,

menyediakan data dalam format yang serasi dengan SELECT bar, 1 AS cat, feh. Lajur crosstab() digunakan sebagai ruang letak tiruan kerana tiada maklumat kategori dalam jadual. cat

Penyelesaian

Terperincicrosstab

Jika lajur kategori sebenar terdapat, anda boleh menggunakannya untuk mengawal susunan nilai dalam keputusan. Pertanyaan berikut menunjukkan ini:

<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>
Salin selepas log masuk
Berita

crosstab

Walaupun penyelesaian di atas menyediakan penjanaan lajur dinamik, pengembalian lajur berbeza secara dinamik dalam PostgreSQL adalah lebih mencabar. Walau bagaimanapun, di bawah sekatan tertentu, ini boleh dicapai menggunakan kefungsian terbina dalam modul

. tablefunc

Kesimpulan

Fungsi

menyediakan alternatif yang berkuasa dan dinamik kepada kaedah crosstab() dan CASE. Ia membenarkan transformasi data yang fleksibel, menjadikannya alat yang berharga untuk manipulasi data dalam PostgreSQL. GROUP BY

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengubah Data Berorientasikan Baris Secara Dinamik kepada Data Berorientasikan Lajur dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan