Table.SelectRows เป็นฟังก์ชันสำหรับกรองตาราง (filter table) ใน Power Query โดยใช้ฟังก์ชันเงื่อนไข (condition function) เพื่อตรวจสอบแต่ละแถว ถ้าเงื่อนไขคืนค่า true จะเก็บแถวนั้นไว้ ถ้าเป็น false จะตัดทิ้ง สามารถใช้ keyword ‘each’ ร่วมกับการอ้างอิงคอลัมน์ด้วย [ColumnName] เพื่อเขียนเงื่อนไขได้สะดวก รองรับการกรองตามตัวเลข ข้อความ วันที่ การตรวจสอบค่า null และเงื่อนไขที่ซับซ้อนด้วย and/or operators ฟังก์ชันนี้รองรับ Query Folding ซึ่งช่วยเพิ่มประสิทธิภาพเมื่อทำงานกับ data source ขนาดใหญ่
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| table | table | ตารางข้อมูลต้นฉบับ (source table) ที่ต้องการกรอง ต้องเป็นข้อมูลประเภท table type ใน Power Query |
| condition | function | ฟังก์ชันเงื่อนไข (condition function) ที่รับแถวหนึ่งแถวเป็น input และคืนค่า true (เก็บแถวนี้) หรือ false (ตัดแถวนี้ทิ้ง) มักเขียนในรูปแบบ ‘each [ColumnName] comparison value’ โดย each เป็น shorthand สำหรับ (_) => _ และ [ColumnName] คือการอ้างอิงคอลัมน์ในแถวปัจจุบัน |
ฟังก์ชัน Table.SelectRows เป็นฟังก์ชันพื้นฐานที่สำคัญที่สุดสำหรับการกรองข้อมูลใน Power Query โดยจะเลือกเก็บเฉพาะแถว (rows) ที่ตรงตามเงื่อนไข (condition) ที่เรากำหนด และตัดแถวที่ไม่ตรงเงื่อนไขออกไป
.
คล้ายกับการใช้ FILTER function ใน Excel หรือการใช้ Filter UI ใน Power Query Editor แต่เขียนเป็นโค้ด M Language ที่สามารถควบคุมได้อย่างละเอียดและทำซ้ำได้อัตโนมัติ ที่เจ๋งคือมันมีความยืดหยุ่นสูงและสามารถนำไปใช้ซ้ำได้ง่ายครับ
.
การใช้ Table.SelectRows มีข้อดีหลายประการที่สำคัญ ได้แก่ การควบคุมเงื่อนไขที่ซับซ้อนได้อย่างละเอียด การจัดการกับค่า null ได้อย่างปลอดภัยและถูกต้อง และที่สำคัญคือรองรับ Query Folding ซึ่งช่วยเพิ่มประสิทธิภาพโดยส่งคำสั่งกรองไปให้ database ทำงานโดยตรง ไม่ต้องโหลดข้อมูลทั้งหมดมาที่ client ก่อน 😎
.
นอกจากนี้ยังสามารถใช้ร่วมกับฟังก์ชัน M อื่นๆ เพื่อสร้างเงื่อนไขการกรองที่ซับซ้อนและตอบโจทย์ธุรกิจได้ ไม่ว่าจะเป็นการกรองข้อมูลตามช่วงวันที่ที่กำหนด การค้นหาข้อความบางส่วนในคอลัมน์ หรือการตรวจสอบหลายเงื่อนไขพร้อมกันด้วย operators แบบ logical
.
ส่วนตัวผมใช้ฟังก์ชันนี้คู่กับ Table.AddColumn, Table.Group, และ Table.Sort บ่อยมากครับ เพราะมันช่วยสร้าง data transformation workflow ที่สมบูรณ์และมีประสิทธิภาพสูง 💡
เลือกเฉพาะรายการสินค้าหรือใบสั่งซื้อที่มียอดขายมากกว่าค่าที่กำหนด เช่น มากกว่า 10,000 บาท เพื่อวิเคราะห์ลูกค้า VIP หรือสินค้าขายดี
กรองออกแถวที่มีคอลัมน์สำคัญเป็นค่าว่าง (null) หรือค่าผิดปกติ เช่น Email ว่าง, วันที่ไม่ถูกต้อง, หมายเลขโทรศัพท์ไม่ครบ เพื่อให้ข้อมูลสะอาดก่อนนำไปวิเคราะห์
กรองข้อมูลตามช่วงเวลาที่ต้องการ เช่น เก็บเฉพาะรายการในปีปัจจุบัน, 30 วันล่าสุด, ไตรมาสที่ 1, หรือช่วงวันที่ที่กำหนด เพื่อวิเคราะห์ข้อมูลในช่วงเวลาที่เฉพาะเจาะจง
เลือกเฉพาะแถวที่มีสถานะหรือหมวดหมู่ที่ต้องการ เช่น สถานะ "Complete", "Shipped", หมวดหมู่ "Electronics", "Food" หรือภูมิภาค "Asia" เพื่อแบ่งกลุ่มข้อมูลตามเกณฑ์ธุรกิจ
ใช้ร่วมกับ Text functions เช่น Text.Contains, Text.StartsWith เพื่อค้นหาแถวที่มีข้อความบางส่วนตรงกัน เช่น ชื่อลูกค้าที่มีคำว่า "Company", รหัสสินค้าที่ขึ้นต้นด้วย "PRD-"
ตัวอย่างนี้สร้างตาราง Sales ด้วย Table.FromRecords แล้วใช้ Table.SelectRows กรองเอาเฉพาะแถวที่ Amount มากกว่า 1000
โดยใช้เงื่อนไข each [Amount] > 1000 ซึ่ง 'each' เป็น keyword ที่ใช้วนลูปตรวจสอบทุกแถว และ [Amount] คือการอ้างอิงคอลัมน์ Amount ในแถวปัจจุบัน
ผลลัพธ์จะได้ table ที่เหลือเพียง 2 แถวที่มียอดขายเกิน 1000 (Bob และ Diana) ส่วน Alice และ Charlie ถูกตัดออกเพราะยอดขายต่ำกว่าเกณฑ์ 😎
ตัวอย่างนี้แสดงการกรองด้วยการเปรียบเทียบข้อความโดยตรง โดยใช้เงื่อนไข each [Category] = "Electronics" เพื่อเลือกเฉพาะสินค้าในหมวด Electronics
ที่ต้องระวังคือ Power Query เป็น case-sensitive นะครับ ดังนั้น "Electronics" จะไม่เท่ากับ "electronics" หรือ "ELECTRONICS" ถ้าต้องการกรองแบบไม่สนตัวพิมพ์เล็ก-ใหญ่ ให้ใช้ Text.Lower([Category]) = "electronics" แทน
ผลลัพธ์จะได้เฉพาะสินค้า 2 รายการที่เป็น Electronics ส่วน Food และ Clothing ถูกกรองออก
ตัวอย่างนี้แสดงการใช้หลายเงื่อนไขพร้อมกัน โดยใช้ operator 'and' เชื่อมเงื่อนไข 3 ตัว: (1) Status ต้องเป็น "Complete" (2) Amount ต้องมากกว่า 1000 และ (3) Email ต้องไม่เป็น null โดยใช้ [Email] <> null เพื่อกรองค่าว่างออก
ผลลัพธ์จะได้เฉพาะแถวที่ตรงเงื่อนไขทั้ง 3 ตัว (OrderID 104) ส่วนแถวอื่นถูกตัดออกเพราะ: OrderID 101 ยอดต่ำกว่า 1000, OrderID 102 เป็น Pending และ Email เป็น null, OrderID 103 ยอดต่ำกว่า 1000, OrderID 105 เป็น Cancelled
ตัวอย่างนี้แสดงให้เห็นความสำคัญของการจัดการ null ใน Power Query ครับ เพราะถ้าไม่ใส่เงื่อนไข [Email] <> null อาจได้ผลลัพธ์ไม่ตรงตามที่ต้องการ 💡
ตัวอย่างนี้แสดงการใช้ Table.SelectRows ร่วมกับฟังก์ชัน M อื่นๆ แบบขั้นสูง โดยใช้ Text.Contains() เพื่อค้นหาข้อความบางส่วนในชื่อลูกค้า (ชื่อที่มีคำว่า "Company" หรือ "Corporation") ใช้ Date.Year() เพื่อดึงปีจากวันที่และเปรียบเทียบว่าเป็นปี 2024 และเงื่อนไขยอดเงินต้องมากกว่าหรือเท่ากับ 5000
ที่เจ๋งคือการใช้ or และ and ร่วมกันทำให้สร้างเงื่อนไขที่ซับซ้อนได้ โดย Power Query จะประเมินเงื่อนไข and ก่อน or ตามหลัก operator precedence
ผลลัพธ์จะได้ธุรกรรมของบริษัท (corporate customers) ที่เกิดในปี 2024 และมียอดเงินตั้งแต่ 5000 ขึ้นไป ตัวอย่างนี้แสดงให้เห็นว่า Table.SelectRows สามารถทำงานร่วมกับฟังก์ชันจากหลาย category (Text, Date, Logical) เพื่อสร้างเงื่อนไขกรองที่มีความซับซ้อนและตอบโจทย์ธุรกิจจริงครับ 😎
เจอปัญหานี้บ่อยมากเลยครับ 😅 สาเหตุหลักคือ Power Query เป็น case-sensitive สำหรับการเปรียบเทียบข้อความ ดังนั้น "Apple" ไม่เท่ากับ "apple" หรือ "APPLE"
ถ้าต้องการกรองแบบไม่สนใจตัวพิมพ์เล็ก-ใหญ่ ให้แปลงทั้งสองฝ่ายเป็นตัวพิมพ์เล็กก่อนเปรียบเทียบ เช่น each Text.Lower([Category]) = "electronics" หรือใช้ Text.Contains([Name], "search", Comparer.OrdinalIgnoreCase) สำหรับการค้นหาที่ไม่สนใจ case
ใช้เงื่อนไข each [Column] null เพื่อกรองค่าว่าง (null) ออก หรือใช้ each [Column] = null เพื่อเลือกเฉพาะแถวที่เป็นค่าว่าง
สามารถใช้ร่วมกับเงื่อนไขอื่นๆ ได้ด้วย and/or เช่น each [Email] null and [Phone] null เพื่อเลือกเฉพาะแถวที่มีข้อมูลครบทั้ง Email และ Phone
ใช่ครับ Table.SelectRows รองรับ Query Folding เมื่อใช้กับ data source ที่รองรับ (เช่น SQL Server, Oracle) และเงื่อนไขที่ใช้เป็นแบบที่สามารถแปลงเป็น SQL WHERE clause ได้
ซึ่งจะช่วยเพิ่มประสิทธิภาพอย่างมากเพราะการกรองจะทำที่ database โดยตรง ไม่ต้องโหลดข้อมูลทั้งหมดมาที่ Power Query ก่อน 😎
แต่ถ้าใช้ custom functions หรือ M functions ที่ซับซ้อนเกินไป อาจทำให้ Query Folding ไม่สามารถทำงานได้ ตรวจสอบได้โดยคลิกขวาที่ step แล้วดู View Native Query
Table.SelectRows ใช้สำหรับกรองโดยระบุเงื่อนไขว่าแถวไหนที่ต้องการเก็บไว้ (positive selection) ส่วน Table.RemoveRows มีหลายรูปแบบ เช่น Table.RemoveRows(table, count) สำหรับลบแถวแรก n แถว หรือ Table.RemoveRows(table, each [condition]) สำหรับลบแถวที่ตรงเงื่อนไข (negative selection)
การเลือกใช้ขึ้นอยู่กับว่าเราต้องการคิดในแบบ "เก็บแถวที่ต้องการ" หรือ "ลบแถวที่ไม่ต้องการ" ตามความเหมาะสมของแต่ละสถานการณ์ครับ
ได้ครับ สามารถอ้างอิงตัวแปรที่ประกาศไว้ใน let statement ก่อนหน้าได้ เช่น let Threshold = 1000, FilteredTable = Table.SelectRows(Source, each [Amount] > Threshold) in FilteredTable จะใช้ค่า Threshold ที่เป็น 1000 ในการกรอง
วิธีนี้ช่วยให้เปลี่ยนค่าเกณฑ์ได้ง่าย โดยไม่ต้องแก้หลายจุด และทำให้โค้ดอ่านง่ายขึ้นด้วย 💡
การใช้ Table.SelectRows (เขียนโค้ด M) มีข้อดีคือ: (1) ควบคุมเงื่อนไขที่ซับซ้อนได้แม่นยำกว่า (2) สามารถใช้ตัวแปร parameters ทำให้ยืดหยุ่น (3) อ่านและบำรุงรักษาโค้ดได้ง่ายกว่าเมื่อมีหลายขั้นตอน (4) สามารถ reuse และ copy ไปใช้ใน query อื่นได้ง่าย
แต่สำหรับเงื่อนไขง่ายๆ การใช้ Filter UI ก็เพียงพอและสะดวกกว่านะครับ ขึ้นอยู่กับความซับซ้อนของงานและประสบการณ์ของผู้ใช้
ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.SelectRows จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
Table.AddColumn เพิ่มคอลัมน์ใหม่ลงในตารางโดยคำนวณค่าจากฟังก์ชันที่กำหนด ใช้คำสั่ง each เพื่ออ้างอิงข้อมูลในแต่ละแถว เช่น each [Price] * [Quantity] สามารถระบุชนิดข้อมูลได้เพื่อเพิ่มประสิทธิภาพและป้องกันข้อผิดพลาดจากการคาดเดาชนิดข้อมูล ทำงานแบบทีละแถวและเหมาะสำหรับสร้างคอลัมน์คำนวณ รวมข้อมูล ใช้เงื่อนไข และการแปลงข้อมูลต่างๆ ใช้ร่วมกับฟังก์ชัน Table.TransformColumns สำหรับแก้ไขคอลัมน์เดิม Table.AddIndexColumn สำหรับเพิ่มหมายเลขลำดับ Table.SelectRows สำหรับกรองแถว Table.FromRecords สำหรับสร้างตารางจากข้อมูล Text.Combine สำหรับรวมข้อความ Number.Round สำหรับปัดเศษ Date.Year สำหรับดึงค่าปี และ Text.Upper สำหรับแปลงเป็นตัวพิมพ์ใหญ่ เพื่อสร้างกระบวนการแปลงข้อมูลที่สมบูรณ์
Table.AddJoinColumn เชื่อมต่อข้อมูลจากสองตารางตามคีย์ที่ตรงกัน โดยเก็บผลลัพธ์ในคอลัมน์ใหม่เป็นตารางแบบ nested แทนการขยายแนวนอน
Table.AddMatchColumn เพิ่มคอลัมน์ใหม่ที่มีค่าจากการแมตช์แถวในตารางอื่น โดยค้นหาค่าที่ตรงกับคีย์ เหมือน VLOOKUP แต่ทำงานโดยตรงบนตารางทั้งหมด
โหลดตารางเข้าสู่หน่วยความจำ (RAM) เพื่อแยกข้อมูลจากแหล่งเดิมและป้องกันไม่ให้ Query Folding ดึงข้อมูลใหม่
Table.Buffer บังคับโหลดตารางลงหน่วยความจำและแยกออกจากแหล่งข้อมูลต้นทาง ช่วยป้องกันการ fold และควบคุมเวลาประมวลผล
Table.Combine ใช้สำหรับรวม list ของ table เข้าเป็น table เดียว ยับยั้ง append ตัว 1 แถวหลาย ๆ ตารางพร้อมกัน
Table.ConformToPageReader ปรับโครงสร้างตารางให้เข้ากับกลไก page reader โดยรับฟังก์ชันสำหรับการจัดรูปแบบ เป็นฟังก์ชันภายในของ Power Query ไม่แนะนำให้ใช้ในโค้ดทั่วไป
Table.Distinct ลบแถวที่ซ้ำกันออกจากตารางตามคอลัมน์ที่กำหนด หรือทั้งตารางถ้าไม่ระบุคอลัมน์
Table.ExpandListColumn ใช้สำหรับขยายคอลัมน์ที่เก็บข้อมูลแบบ List ให้เป็นแถวแยก โดยแต่ละรายการใน List จะกลายเป็นแถวใหม่ ส่วนข้อมูลในคอลัมน์อื่นจะถูกทำซ้ำตามจำนวน
ดึงแถวแรก (Record) จากตารางข้อมูล พร้อมตัวเลือกค่า default สำหรับกรณีตารางว่าง
Table.Group จัดกลุ่มข้อมูลตามคอลัมน์ที่กำหนดและสรุปผลในแต่ละกลุ่มด้วย aggregation functions เช่น List.Sum, List.Count, List.Average คล้ายกับ GROUP BY ใน SQL แต่ทรงพลังกว่าเพราะสามารถจัดกลุ่มหลายคอลัมน์พร้อมกันและสร้างคอลัมน์สรุปผลหลายคอลัมน์ในคำสั่งเดียว รองรับ GroupKind.Local เพื่อเพิ่มประสิทธิภาพเมื่อข้อมูลเรียงลำดับแล้ว
Table.IsEmpty ใช้สำหรับตรวจสอบว่าตารางไม่มีข้อมูล (ไม่มีแถว) ใช่หรือไม่ คืนค่า true หากตารางว่าง false หากมีข้อมูลอย่างน้อย 1 แถว
Table.Join ใช้รวมตารางสองตารางโดยจับคู่ค่าในคอลัมน์กำหนด สนับสนุนทุกประเภท join (Inner, Left Outer, Right Outer, Full Outer, Anti, Semi) เหมือน SQL Join
Table.NestedJoin เชื่อมตารางสองตารางด้วยคีย์ที่กำหนด และสร้างคอลัมน์ใหม่ที่เก็บตารางย่อยของแถวที่จับคู่ได้ เหมาะกับงาน Merge ที่ต้องการเก็บรายละเอียดฝั่งขวาไว้เป็น nested table ก่อนจะ Expand หรือทำขั้นตอนต่อ
Table.RemoveRows ใช้สำหรับลบแถวออกจากตาราง โดยระบุตำแหน่งเริ่มต้นและจำนวนแถวที่ต้องการลบ
Table.ReplacePartitionKey แทนที่ partition key ของตาราง ซึ่งเป็น metadata สำหรับการแบ่งพาร์ทิชันและการจัดการข้อมูลภายใน เอาไว้ควบคุมวิธีการแบ่งพาร์ทิชันของข้อมูลในตารางนั้น
Table.ReplaceValue ใช้สำหรับค้นหาและแทนที่ค่าในตารางได้หลายวิธี ตั้งแต่แทนที่ค่าทั้งหมดไปจนถึงแทนที่แบบมีเงื่อนไข
AzureStorage.Blobs ดึงรายชื่อของ blobs (ไฟล์) ที่มีอยู่ในคอนเทนเนอร์ Azure Storage และสร้างตารางนำทางเพื่อเข้าถึงไฟล์เหล่านั้น
Excel.CurrentWorkbook เป็น function ที่ใช้เข้าถึง Table, Named Range และ Dynamic Array ทั้งหมดที่อยู่ใน Excel workbook ปัจจุบัน โดย return เป็น table ที่มี metadata และเนื้อหาของแต่ละ object ทำให้สามารถอ้างอิงข้อมูลภายใน workbook ได้อย่างยืดหยุ่น เหมาะสำหรับการสร้าง query ที่ portable และไม่ต้องพึ่งพา file path
OleDb.DataSource ใช้สำหรับเชื่อมต่อกับฐานข้อมูล OLE DB (SQL Server, Access, MySQL ผ่าน ODBC เป็นต้น) และนำเข้าตารางหรือแสดงผลจากคำสั่ง SQL
SharePoint.Tables เป็นฟังก์ชันสำหรับดึงข้อมูลทั้งหมดจาก SharePoint List มา Power Query โดยคืนค่าตารางที่มีแถวสำหรับแต่ละรายการใน List พร้อมกับจัดการการเชื่อมต่อและการรับรองตัวตนอัตโนมัติ
ระบุประเภทการจัดกลุ่มใน Table.Group ว่าจะใช้ Local (จัดกลุ่มแถวติดต่อกัน) หรือ Global (รวบรวมแถวทั้งหมดที่มี key เดียวกัน) ใช้เพื่อปรับประสิทธิภาพและควบคุมวิธีการจัดกลุ่มข้อมูล
JoinKind.Type คือ enum ที่ระบุประเภทของการ Join (Inner, Outer, Anti, Semi) เมื่อรวมตารางข้อมูลสองตาราง ใช้กับ Table.Join เพื่อควบคุมว่าแถวไหนจะปรากฏในผลลัพธ์
List.FindText ค้นหาสมาชิกในรายการที่มีข้อความย่อยที่กำหนด เหมาะเมื่อต้องการกรองข้อมูลไม่ใช่แค่ตรงแม่นทั้งคำ แต่ต้องการค้นหาแบบบางส่วนก็ได้
ฟังก์ชันสำหรับนับจำนวนแถวทั้งหมดในตาราง โดยคืนค่าเป็นตัวเลขครับ
Table.SelectColumns ใช้สำหรับเลือกคอลัมน์เฉพาะจากตารางและสร้างตารางใหม่ที่มีเฉพาะคอลัมน์เหล่านั้น
เรียงลำดับข้อมูลในตารางตามคอลัมน์ที่ระบุ รองรับการเรียงหลายระดับและกำหนดทิศทางการเรียง
Table.StopFolding ป้องกันไม่ให้ขั้นตอน downstream ถูกส่งกลับไปประมวลผลที่ data source เดิม ช่วยเมื่อต้องดีบักหรือเมื่อการบังคับประมวลผลใน Power Query ให้ผลลัพธ์ที่คาดหวัง
Table.WithErrorContext เป็นฟังก์ชันภายใน Power Query ที่ใช้เพิ่มข้อมูล context ให้กับค่า เพื่อให้ error messages มีความชัดเจนมากขึ้นเวลา debug
Tables.GetRelationships ดึงข้อมูลความสัมพันธ์ (Relationships) ระหว่างตารางต่างๆ จาก Navigation Table เพื่อวิเคราะห์โครงสร้างข้อมูล
Text.Length ใช้นับจำนวนตัวอักษรทั้งหมดในสตริงข้อความ รวมถึงช่องว่างและอักขระพิเศษ ผลลัพธ์คืนค่าเป็นตัวเลข มีประโยชน์ในการตรวจสอบคุณภาพข้อมูล การกรองข้อมูลตามความยาว หรือการคำนวณ Logic ต่างๆ
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่