Rumah >pangkalan data >tutorial mysql >Bagaimanakah saya Boleh Mengubah Data dengan Berkesan pada Berbilang Lajur Menggunakan tablefunc PostgreSQL?
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.
Untuk menyelesaikan isu ini, pastikan anda mematuhi perintah yang ditentukan oleh tablefunc:
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.
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.
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!