Table.AddJoinColumn เชื่อมต่อข้อมูลจากสองตารางตามคีย์ที่ตรงกัน โดยเก็บผลลัพธ์ในคอลัมน์ใหม่เป็นตารางแบบ nested แทนการขยายแนวนอน
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| table1 | table | ตารางหลัก (primary table) ที่ต้องการเพิ่มคอลัมน์ join |
| key1 | text or list | ชื่อคอลัมน์ (หรือ list หลายคอลัมน์) ในตารางหลักที่ใช้เป็น key สำหรับ join |
| table2 | function | ฟังก์ชันที่ return ตารางที่ต้องการ join กับ (ต้องเขียนเป็น () => TableName) |
| key2 | text or list | ชื่อคอลัมน์ (หรือ list หลายคอลัมน์) ในตารางที่ join ที่ต้องการเทียบกับ key1 |
| newColumnName | text | ชื่อของคอลัมน์ใหม่ที่จะเก็บผลลัพธ์ join (เป็นตารางแบบ nested) |
Table.AddJoinColumn รับตารางหลัก ตารางที่ join กับ และข้อกำหนดว่าจะเชื่อมตามคอลัมน์ไหน ผลลัพธ์จะปรากฏในคอลัมน์ใหม่เป็นตารางแบบซ้อน (nested table) ไม่ flatten แบบแนวนอน เป็น LeftOuter join หมายความว่าแถวทั้งหมดจากตารางหลักคงไว้ เพียงแต่เพิ่มข้อมูล match จากตารางที่ join
ที่เจ๋งคือ Table.AddJoinColumn ช่วยให้เก็บความสัมพันธ์ระหว่างข้อมูล (relationship) ไว้ได้อย่างชัดเจน แถมสามารถเลือกว่าจะ expand (flatten) ออกมากี่คอลัมน์ก็ได้ ต่างจาก Table.Join ที่ flatten ทั้งหมดจึงเสียความยืดหยุ่น สำหรับ performance มันก็ดี เพราะเก็บตารางแยกกันไว้
ส่วนตัวผมใช้ฟังก์ชันนี้เวลาต้องการเก็บข้อมูล detail ไว้ก่อน แล้วค่อย expand เฉพาะคอลัมน์ที่ต้องการหลังจากนั้น มันให้ความยืดหยุ่นมากเวลาต้องแก้ไข logic ของ join ได้ง่ายขึ้น 😎
Custom Join implementation
ทำ left join Sales กับ PriceData ตาม SaleID โดยใส่ผลลัพธ์ลงในคอลัมน์ PriceInfo แบบ nested table ซึ่งแต่ละเซลล์จะมีตารางเล็กๆ ที่มีข้อมูล price ทั้งหมด match กับ row นั้นๆ
Join ตาราง Orders (query ปัจจุบัน) กับ Customers query ที่อยู่ใน Excel workbook เดียวกัน โดยเก็บข้อมูล Customer detail ไว้ในคอลัมน์ nested
Join ตั้งแต่ 2 คอลัมน์พร้อมกัน (Year และ Month) ต้องมีค่าทั้ง Year และ Month ตรงกันกับตารางที่ join ใช้ list {"Col1", "Col2", …} เพื่อระบุ composite key
แสดงวิธี combine Table.AddJoinColumn กับ Table.ExpandTableColumn เพื่อให้ได้ผลลัพธ์ flatten แต่เฉพาะคอลัมน์ที่ต้องการเท่านั้น อันนี้เป็นวิธีใจความที่ดีมากครับ
Table.Join จะ flatten ผลลัพธ์ออกมาเป็นแถวแยก (multiplication ของแถว) แต่ Table.AddJoinColumn จะเก็บผลลัพธ์ join เป็นตารางแบบ nested ในคอลัมน์เดียว ซึ่งให้ความยืดหยุ่นมากว่า แล้วค่อย expand บางคอลัมน์หรือทั้งหมดก็ได้
เพราะ Power Query จะประมวลผล function นี้อย่างมีประสิทธิภาพ โดยรอจนกว่าจะประเมินค่า key ใน table1 เสร็จสิ้นก่อน หลังจากนั้นค่อยเรียกใช้ table2 ช่วยหลีกเลี่ยงการโหลดตารางทั้งหมดล่วงหน้า และช่วย performance ได้เยอะ ผมแนะนำให้เสมอเขียน () => TableName
จะได้ตารางว่าง (empty table) ในคอลัมน์ nested ของแถวนั้น เพราะเป็น LeftOuter join มีความหมายว่าแถวจาก table1 ยังอยู่แม้ว่าไม่มี match ใน table2 หากต้องการ inner join (เก็บเฉพาะที่มี match) ต้องใช้ Table.Join แทน
ได้ครับ ใช้ list {"Column1", "Column2", "Column3", …} แทนชื่อคอลัมน์เดี่ยว เวลานี้ Power Query จะต้องมีค่าทั้งหมดตรงกัน (composite key)
ผลก็คือคอลัมน์ nested จะมีหลายแถว สำหรับแต่ละแถวจาก table1 ตัวอย่างเช่น order 1 อัน มี product 3 ชนิด คอลัมน์ nested จะเป็นตาราง 3 แถว ผมแนะนำให้ expand มาดูชัดๆ ว่าข้อมูลตรงกับที่คิดไหม
ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.AddJoinColumn จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
Table.AddMatchColumn เพิ่มคอลัมน์ใหม่ที่มีค่าจากการแมตช์แถวในตารางอื่น โดยค้นหาค่าที่ตรงกับคีย์ เหมือน VLOOKUP แต่ทำงานโดยตรงบนตารางทั้งหมด
Table.ExpandTableColumn ใช้แตกข้อมูลจากคอลัมน์ที่เป็น nested table ออกมาเป็นคอลัมน์และแถวปกติในตารางหลัก โดยรักษาข้อมูลคอลัมน์อื่นไว้ และทำซ้ำแถวหลักสำหรับแต่ละแถวในตารางซ้อน มักใช้คู่กับ Table.NestedJoin หลัง join ตาราง หรือใช้ขยายข้อมูลจากแหล่งที่มีโครงสร้างแบบ hierarchical เช่น JSON หรือ API
แปลง List ของ Record เป็นตาราง โดยแต่ละ Record กลายเป็นหนึ่งแถว เหมาะสำหรับข้อมูลจาก API หรือ JSON
Table.Join ใช้รวมตารางสองตารางโดยจับคู่ค่าในคอลัมน์กำหนด สนับสนุนทุกประเภท join (Inner, Left Outer, Right Outer, Full Outer, Anti, Semi) เหมือน SQL Join
Table.NestedJoin เชื่อมตารางสองตารางด้วยคีย์ที่กำหนด และสร้างคอลัมน์ใหม่ที่เก็บตารางย่อยของแถวที่จับคู่ได้ เหมาะกับงาน Merge ที่ต้องการเก็บรายละเอียดฝั่งขวาไว้เป็น nested table ก่อนจะ Expand หรือทำขั้นตอนต่อ
Table.SelectRows เป็นฟังก์ชันสำหรับกรองตาราง (filter table) ใน Power Query โดยใช้ฟังก์ชันเงื่อนไข (condition function) เพื่อตรวจสอบแต่ละแถว ถ้าเงื่อนไขคืนค่า true จะเก็บแถวนั้นไว้ ถ้าเป็น false จะตัดทิ้ง สามารถใช้ keyword 'each' ร่วมกับการอ้างอิงคอลัมน์ด้วย [ColumnName] เพื่อเขียนเงื่อนไขได้สะดวก รองรับการกรองตามตัวเลข ข้อความ วันที่ การตรวจสอบค่า null และเงื่อนไขที่ซับซ้อนด้วย and/or operators ฟังก์ชันนี้รองรับ Query Folding ซึ่งช่วยเพิ่มประสิทธิภาพเมื่อทำงานกับ data source ขนาดใหญ่
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่