Tag Archive Unpivot

Byphunsanit

เอา Matrix มาสลับ column ใน database แนวนอนแนวตั้ง

ในบรรดาวิชาเลขที่เรียนกันตอนคณิตศาสตร์มัธยมปลายเป็นสิ่งที่ตอนเรียน อาจารย์ไม่สามารถบอกได้ว่าเรียนมันไปทำไมนะ เอาไปใช้ทำอะไร เลยไม่สนใจเท่าไหร่ เค้าใให้เรียนสลับ จัดรูปแบบอะไรไป ก็ท่องวิธีจำ วิธีทำไปงั้น ๆ ละ จนเขียนโปรแกรมมาได้ซักพักจึงมารู้ว่ามันคือ Pivot / Unpivot (ในระบบฐานข้อมูลและ Excel) ที่คนเรียนเลขเค้าใช้คำว่า Matrix Reshaping (การปรับรูปร่างเมทริกซ์), Vectorization (แตกให้เป็นแถวเดียวยาว ๆ)


ตารางแนวนอนและตารางแนวตั้ง

ตัวอย่างตาราง permission ที่เก็บแบบแนวนอน ที่มี column id, program_id, create, read, update, delete, {สิทธิ์อื่น ๆ } ต่อไปทางขวาเรื่อย ๆ ถึงเรียกว่าตารางแนวนอน เป็นตารางแนวตั้ง เช่น ตาราง permission ที่เก็บข้อมูลที่มี column id, program_id, permission (เก็บ create, read, update, delete, {สิทธิ์อื่น ๆ }) เป็นอีก rows เพิ่มขึ้นเรื่อย ๆ เรียกว่าตารางแนวตั้ง

ตารางแนวนอน (Wide)

idprogram_idcreatereadupdatedelete{สิทธิ์อื่น ๆ }
1p1///
2p2///
3p3///

ตารางแนวตั้ง (Long / Tall)

idprogram_id
permission
1p1create
2p1read
3p1update
4p1delete
5p2create
6p2read
7p2delete
8p3create
9p3read
10p3สิทธิ์อื่น ๆ }

การเปรียบเทียบตารางแนวนอนและตารางแนวตั้ง

หัวข้อเปรียบเทียบตารางแนวนอน (Wide)ตารางแนวตั้ง (Long / Tall)
ลักษณะโครงสร้างข้อมูลแต่ละประเภทจะแยกเป็นคอลัมน์ชัดเจน (เช่น เลข 1-8 อยู่คนละช่องในแถวเดียว)ข้อมูลจะถูก “กอง” ลงมาในคอลัมน์เดียวกัน แต่ระบุตำแหน่งด้วย Index (เช่น k)
การอ่านของมนุษย์อ่านง่ายมาก มองแวบเดียวเห็นภาพรวมทั้งหมดเหมือนในรูปภาพที่คุณส่งมาอ่านยากกว่า เพราะต้องเลื่อนลงไปดูข้อมูลที่ยาวขึ้น
การประมวลผล (Machine)ยากต่อการทำ Aggregation หรือ Filter เมื่อข้อมูลมีจำนวนคอลัมน์มากเกินไปดีเยี่ยม สำหรับการทำ Data Analysis, SQL Queries และการทำ Machine Learning
การเพิ่มข้อมูลต้องเพิ่มคอลัมน์ใหม่ (Alter Table) ซึ่งทำได้ยากในระบบฐานข้อมูลใหญ่ๆเพิ่มแค่แถวใหม่ (Append Row) ซึ่งทำได้ง่ายและไม่กระทบโครงสร้างตาราง
พื้นที่จัดเก็บอาจมีช่องว่าง (Null) เยอะถ้าข้อมูลไม่ครบในทุกคอลัมน์ประหยัดพื้นที่กว่าในกรณีข้อมูลแบบ Sparse เพราะจะเก็บเฉพาะแถวที่มีค่าจริง

Matrix Reshaping (การปรับรูปร่างเมทริกซ์)

ในทางคณิตศาสตร์เชิงคำนวณหรือการเขียนโปรแกรม (เช่น NumPy หรือ R) การเปลี่ยนมิติของ Array จาก 2×8 (2 แถว 8 คอลัมน์) ไปเป็น 8×2 (8 แถว 2 คอลัมน์) โดยที่ลำดับของตัวเลขยังเรียง 1, 2, 3… เหมือนเดิม เรียกว่าการ Reshape ครับ

Transposition (การสลับเปลี่ยน) – แบบมีเงื่อนไข

ปกติการ Transpose (AT) คือการเปลี่ยนแถวเป็นคอลัมน์ ซึ่งจะทำให้ตัวเลขเปลี่ยนตำแหน่งไป เช่น แถวแรก (1-8) จะกลายเป็นคอลัมน์แรกทั้งหมด

  • แต่ในรูปของ database: ไม่ใช่การ Transpose แบบมาตรฐาน เพราะคุณต้องการให้มัน “ไหล” ต่อกัน (Row-major order)
  • แต่ในรูปของคุณ: ไม่ใช่การ Transpose แบบมาตรฐาน เพราะคุณต้องการให้มัน “ไหล” ต่อกัน (Row-major order)

Pivot / Unpivot (ในระบบฐานข้อมูลและ Excel)

การเปลี่ยนจากแนวขวาง (Wide Format) มาเป็นแนวตั้ง (Long Format) เรียกว่าการ Unpivot หรือ Melting ครับ


เมื่อไหร่ควรใช้แบบไหน?

  1. ตารางแนวนอน (Wide Format)
    • การนำเสนอ (Reporting): ใช้สำหรับทำ Dashboard หรือ Report ให้คนดู เพราะเห็นความสัมพันธ์ของข้อมูลในบรรทัดเดียว
    • Data Entry: เหมาะสำหรับฟอร์มกรอกข้อมูลที่ผู้ใช้ต้องกรอกข้อมูลหลายหัวข้อพร้อมกัน
  2. ตารางแนวตั้ง (Long Format)
    • Database Design: เหมาะสำหรับการออกแบบตารางใน SQL Server หรือ MySQL โดยเฉพาะตารางประเภท Transaction หรือ Permissions (RBAC)
    • Data Visualization: โปรแกรมอย่าง Tableau, Power BI หรือ Library อย่าง Matplotlib จะทำงานได้เร็วและยืดหยุ่นกว่าเมื่อข้อมูลอยู่ในรูปแบบแนวตั้ง
    • การทำ Reshaping: เหมือนใน Algorithm ที่เราคุยกัน การเปลี่ยนเป็นแนวตั้งช่วยให้เราจัดการลำดับ (Index k) ได้แม่นยำกว่า

อ่านเพิ่มเติม