Rumah >pangkalan data >tutorial mysql >Bagaimanakah saya Boleh Mengubah Data dengan Berkesan pada Berbilang Lajur Menggunakan tablefunc PostgreSQL?

Bagaimanakah saya Boleh Mengubah Data dengan Berkesan pada Berbilang Lajur Menggunakan tablefunc PostgreSQL?

Susan Sarandon
Susan Sarandonasal
2025-01-14 08:44:431000semak imbas

How Can I Effectively Pivot Data on Multiple Columns Using PostgreSQL's tablefunc?

Gunakan Tablefunc untuk data pangsi berbilang lajur

Apabila memproses data yang mengandungi berbilang atribut dan ukuran, mungkin perlu menukarnya daripada format panjang kepada lebar untuk analisis yang cekap. Fungsi tablefunc PostgreSQL menyediakan penyelesaian yang mudah untuk penukaran tersebut. Walau bagaimanapun, adalah penting untuk memahami batasannya apabila bekerja dengan berbilang lajur pangsi.

Dalam balasan kepada pertanyaan sebelumnya, seorang pengguna meminta panduan tentang menggunakan tablefunc untuk berputar tetapi menghadapi cabaran apabila bekerja dengan berbilang lajur pangsi. Memandangkan tablefunc menjangkakan lajur tambahan yang konsisten untuk setiap nama baris, pertanyaan asal menghasilkan data yang tidak lengkap.

Masalah Selesai

Untuk menyelesaikan isu ini, pastikan anda mematuhi perintah yang ditentukan oleh tablefunc:

  1. Nama Baris: Lajur ini mesti sentiasa didahulukan.
  2. Lajur tambahan (pilihan): Sebarang lajur tambahan hendaklah datang selepas lajur nama baris jika perlu.
  3. Kategori dan Nilai (dua lajur terakhir): Lajur Kategori Pivot dan Nilai mestilah dalam susunan ini sebagai dua lajur terakhir.

Pelaksanaan

Dalam contoh yang diberikan, output yang diingini memerlukan berputar pada dua lajur (entiti dan status). Untuk melakukan ini, pertanyaan telah diubah suai seperti berikut:

<code class="language-sql">SELECT *
FROM crosstab(
   'SELECT entity, timeof, status, ct
    FROM t4
    ORDER BY 1'
 , 'VALUES (1), (0)'
   ) AS ct (
      "Attribute" character
    , "Section" timestamp
    , "status_1" int
    , "status_0" int
      );</code>

Dengan menggunakan entiti sebagai nama baris dan menukar tertib masa dan entiti, pertanyaan berjaya berputar pada berbilang lajur.

Variasi dengan tetapan berbeza

Untuk persediaan yang disebut dalam respons, di mana data diisih mengikut localt dan entity , pertanyaan yang diubah suai adalah seperti berikut:

<code class="language-sql">SELECT localt, entity
     , msrmnt01, msrmnt02, msrmnt03, msrmnt04, msrmnt05  -- , more?
FROM crosstab(
  'SELECT dense_rank() OVER (ORDER BY localt, entity)::int AS row_name
        , localt, entity -- additional columns
        , msrmnt, val
   FROM test
-- WHERE  ???   -- instead of LIMIT at the end
   ORDER BY localt, entity, msrmnt
-- LIMIT ???'   -- instead of LIMIT at the end
, 'SELECT generate_series(1,5)'  -- more?
   ) AS ct (row_name int, localt timestamp, entity int
          , msrmnt01 float8, msrmnt02 float8, msrmnt03 float8, msrmnt04 float8, msrmnt05 float8 -- , more?
            )
LIMIT 1000  -- ?!</code>

Pertanyaan ini menggunakan dense_rank() untuk menjana nama baris proksi dan termasuk klausa WHERE pilihan untuk menapis data sebelum diproses. Selain itu, syarat LIMIT telah dialih keluar daripada subkueri untuk meningkatkan prestasi dengan hanya memproses baris yang diperlukan.

Kesimpulan

Dengan memahami pengehadan dan mengikut tertib yang ditentukan oleh tablefunc, anda boleh berputar dengan berkesan pada berbilang lajur, walaupun untuk set data yang besar. Ingat untuk mengoptimumkan pertanyaan dengan menggunakan klausa WHERE atau syarat LIMIT yang sesuai untuk mengelakkan pemprosesan yang tidak perlu.

Atas ialah kandungan terperinci Bagaimanakah saya Boleh Mengubah Data dengan Berkesan pada Berbilang Lajur Menggunakan tablefunc PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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