Thep Excel

Table.FuzzyJoinเชื่อมตารางโดยใช้การเปรียบเทียบแบบ Fuzzy (คล้ายกัน)

Table.FuzzyJoin ใช้สำหรับเชื่อม 2 ตารางเข้าด้วยกันโดยใช้คีย์ที่มีความคล้ายคลึงกัน (Fuzzy Matching) แทนที่จะต้องเหมือนกันทุกตัวอักษร สามารถกำหนดระดับความเหมือน (Threshold) และตัวเลือกอื่นๆ ได้

fx
=Table.FuzzyJoin(table1, key1, table2, key2, [joinKind], [joinOptions]) as table

ความนิยม4/10
ความยาก7/10
ประโยชน์6/10

อัปเดต 15 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
table1 table ตารางแรก (ซ้าย) ที่จะเชื่อม
key1 any ชื่อคอลัมน์ที่ใช้เชื่อมจากตารางแรก สามารถเป็นข้อความเดียว (“ColName”) หรือลิสต์ ({“Col1”, “Col2”})
table2 table ตารางที่สอง (ขวา) ที่จะเชื่อม
key2 any ชื่อคอลัมน์ที่ใช้เชื่อมจากตารางที่สอง ต้องมีจำนวนเท่ากับ key1
[joinKind]ไม่บังคับ nullable number JoinKind.Inner ประเภท Join: JoinKind.Inner, JoinKind.LeftOuter, JoinKind.RightOuter, JoinKind.FullOuter, JoinKind.LeftAnti, JoinKind.RightAnti, JoinKind.LeftSemi, JoinKind.RightSemi
[joinOptions]ไม่บังคับ nullable record null (ค่า Default: Threshold=0.80, IgnoreCase=true, IgnoreSpace=true) ตัวเลือก Fuzzy Matching ใน Record เช่น [IgnoreCase=true, IgnoreSpace=true, Threshold=0.8, SimilarityColumnName=”Score”]

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

Table.FuzzyJoin ใช้สำหรับเชื่อม 2 ตารางเข้าด้วยกันโดยใช้ Fuzzy Matching แทนที่จะหาตัวเลขหรือตัวอักษรที่เหมือนกันเป๊ะแป๊ะ (เหมือน Table.Join) ฟังก์ชันนี้ยอมรับความเหมือน แม้จะมีการสะกดผิด ตัวพิมพ์ต่างกัน หรือช่องว่างเกินมา ซึ่งช่วยได้มากเมื่อเชื่อมข้อมูลจากหลายแหล่งที่มีคุณภาพไม่เท่ากัน

วิธีการทำงานของ Fuzzy Matching คือการเปรียบเทียบความคล้ายคลึงของข้อความ (Similarity Score) บนระดับ 0.00 ถึง 1.00 โดย 1.00 หมายถึงเหมือนกันเป๊ะ ส่วน 0.00 หมายถึงไม่เหมือนเลย ค่า Threshold ที่กำหนด (ปกติ 0.80) คือค่าต่ำสุดที่จำเป็นต้องมีเพื่อนับว่าเป็นการ Match ที่ถูกต้อง

ส่วนตัวผม Table.FuzzyJoin มักใช้ในสถานการณ์เหล่านี้:
– เชื่อมข้อมูลจากสองระบบที่มีการสะกดชื่อลูกค้าไม่เสมอกัน
– จัดการกับข้อมูลจาก CSV ที่ยูเซอร์พิมพ์มือ (ผิดบ่อย!)
– เชื่อมรหัสหรือเลขประจำตัวที่อาจพิมพ์ผิดตัวเลข
แต่ก็ต้องระวังเรื่องปลอดภัย เพราะถ้า Threshold ต่ำเกินไป อาจจับคู่ข้อมูลผิดตัวได้ เช่น ‘John’ เข้ากับ ‘Joan’ 555.

How it works

Map ข้อมูลระหว่างระบบที่ใช้มาตรฐานการตั้งชื่อต่างกัน

ใช้เชื่อมข้อมูลสินค้าหรือลูกค้าที่ชื่อสะกดไม่เหมือนกันเป๊ะๆ ระหว่างสองระบบ

แก้ปัญหา Typos ในการ Join ข้อมูล

ช่วยให้การ Join ไม่ล้มเหลวเพียงเพราะมีตัวอักษรผิดพลาดเล็กน้อย

Examples

ตัวอย่างที่ 1: Join โดยไม่สนตัวพิมพ์เล็กใหญ่let Customers = Table.FromRecords({ [ID = 1, City = "Bangkok"], [ID = 2, City = "Chiang Mai"], [ID = 3, City = "Phuket"] }), CityData = Table.FromRecords({ [Cit…

ใช้ IgnoreCase=true เพื่อให้ 'Bangkok' จับคู่กับ 'bangkok' ได้ ส่วน LeftOuter ให้แถวจาก Customers ทั้งหมดแม้ไม่จับคู่

fx
let
Customers = Table.FromRecords({
[ID = 1, City = "Bangkok"],
[ID = 2, City = "Chiang Mai"],
[ID = 3, City = "Phuket"]
}),
CityData = Table.FromRecords({
[CityName = "bangkok", Region = "Central"],
[CityName = "chiang mai", Region = "North"],
[CityName = "phuket", Region = "South"]
}),
Joined = Table.FuzzyJoin(
Customers, "City",
CityData, "CityName",
JoinKind.LeftOuter,
[IgnoreCase = true]
)
in
Joined

ผลลัพธ์ตารางผลลัพธ์ 3 แถว: ID, City, CityName, Region – Bangkok, Chiang Mai, Phuket จับคู่ได้สำเร็จแม้ว่า case ต่างกัน
ตัวอย่างที่ 2: กำหนดค่า Threshold สำหรับตัวสะกดผิดlet Products = Table.FromRecords({ [ProdID = 1, Product = "Microsoft Office"], [ProdID = 2, Product = "Google Workspace"], [ProdID = 3, Product = "Adobe Creativ…

Threshold=0.75 ยอมรับความเหมือนที่ 75% ขึ้นไป พอสำหรับจับการสะกดผิดเล็กน้อย IgnoreSpace=true ทำให้ 'Micro soft' ถูกมองเสมือน 'Microsoft'

fx
let
Products = Table.FromRecords({
[ProdID = 1, Product = "Microsoft Office"],
[ProdID = 2, Product = "Google Workspace"],
[ProdID = 3, Product = "Adobe Creative Cloud"]
}),
Inventory = Table.FromRecords({
[ItemName = "Micro soft Office", Stock = 150],
[ItemName = "Googl Workspace", Stock = 200],
[ItemName = "Adobe Creative Cloud", Stock = 50]
}),
Joined = Table.FuzzyJoin(
Products, "Product",
Inventory, "ItemName",
JoinKind.LeftOuter,
[Threshold = 0.75, IgnoreSpace = true]
)
in
Joined

ผลลัพธ์ตารางผลลัพธ์: 'Microsoft Office' เข้ากับ 'Micro soft Office' แม้มีช่องว่างพิเศษ, 'Google Workspace' เข้ากับ 'Googl Workspace'
ตัวอย่างที่ 3: แสดงค่า Similarity Scorelet Customers = Table.FromRecords({ [CustName = "John Smith"], [CustName = "Jane Doe"], [CustName = "Bob Wilson"] }), Orders = Table.FromRecords({ [BuyerName =…

SimilarityColumnName ใช้เพื่อเพิ่มคอลัมน์ที่แสดงคะแนนความเหมือนจริงๆ ช่วยให้ตรวจสอบการจับคู่ได้

fx
let
Customers = Table.FromRecords({
[CustName = "John Smith"],
[CustName = "Jane Doe"],
[CustName = "Bob Wilson"]
}),
Orders = Table.FromRecords({
[BuyerName = "Jon Smith", OrderID = "O1"],
[BuyerName = "Jane Do", OrderID = "O2"],
[BuyerName = "Robert Wilson", OrderID = "O3"]
}),
Joined = Table.FuzzyJoin(
Customers, "CustName",
Orders, "BuyerName",
JoinKind.LeftOuter,
[Threshold = 0.70, SimilarityColumnName = "MatchScore"]
)
in
Joined

ผลลัพธ์ตารางผลลัพธ์ มีคอลัมน์ MatchScore แสดงว่า 'John Smith' เข้ากับ 'Jon Smith' ได้ 90%, 'Jane Doe' เข้า 'Jane Do' ได้ 80% เป็นต้น
ตัวอย่างที่ 4: Join หลายคอลัมน์let Table1 = Table.FromRecords({ [FirstName = "John", LastName = "Smith", ID = 1], [FirstName = "Jane", LastName = "Doe", ID = 2] }), Table2 = Table.FromRecords…

เมื่อใช้ลิสต์หลายคอลัมน์ {"FirstName", "LastName"} ต้องจับคู่ทั้งคู่ถึงถือว่าเป็นการ Match

fx
let
Table1 = Table.FromRecords({
[FirstName = "John", LastName = "Smith", ID = 1],
[FirstName = "Jane", LastName = "Doe", ID = 2]
}),
Table2 = Table.FromRecords({
[FName = "jon", LName = "smith", Phone = "555-1234"],
[FName = "jane", LName = "do", Phone = "555-5678"]
}),
Joined = Table.FuzzyJoin(
Table1, {"FirstName", "LastName"},
Table2, {"FName", "LName"},
JoinKind.LeftOuter,
[IgnoreCase = true, Threshold = 0.80]
)
in
Joined

ผลลัพธ์ตารางผลลัพธ์: แถว 1 เข้าคู่ (FirstName='John' เข้า FName='jon', LastName='Smith' เข้า LName='smith'), แถว 2 อาจไม่เข้าคู่ถ้า 'Doe' ไม่เหมือน 'do' มากพอ

FAQs

Threshold ควรตั้งค่าเท่าไหร่?+

ขึ้นอยู่กับกรณีการใช้งาน: 0.90 ขึ้นไป = แม่นยำสูง ยอมรับเฉพาะการสะกดผิดเล็กน้อย | 0.80 = ค่า Default ที่สมดุล | 0.70 = ยืดหยุ่นมากขึ้น ยอมรับการสะกดผิดระดับกลาง | ต่ำกว่า 0.70 = ระวัง อาจจับคู่ผิด เช่น 'John' เข้ากับ 'Joan'

ต่างกันอะไร Table.FuzzyJoin กับ Table.Join?+

Table.Join ต้องการความเหมือนแบบ Exact (ตรงกันทุกตัว) ส่วน Table.FuzzyJoin ยอมรับความเหมือนแบบ Approximate (คล้ายๆกัน) ถ้าข้อมูลสะอาด Table.Join จะเร็วกว่า แต่ถ้ามีการสะกดผิดจำเป็นต้อง FuzzyJoin

SimilarityColumnName ใช้ทำไม?+

เพิ่มคอลัมน์ใหม่ที่แสดงคะแนนความเหมือนจริงๆ (0.00-1.00) ช่วยให้ตรวจสอบว่า Match นั้นเชื่อถือได้แค่ไหน เช่น Match ที่ 0.95 น่าเชื่อ แต่ 0.71 ต้องสังสัย

IgnoreSpace=true ทำอะไร?+

รวมข้อความที่มีช่องว่างเกิน เช่น 'Micro soft' ถูกมองเป็น 'Microsoft' ใช้ได้ดีกับชื่อ ที่บางคนพิมพ์มีช่องว่างตรงกลาง แต่ต้องระวังกับสถานการณ์ที่ต้องรักษาช่องว่างไว้

ConcurrentRequests=4 มีประโยชน์ไหม?+

ใช่ เพิ่ม ConcurrentRequests ให้สูงขึ้น (1-8) ทำให้การจับคู่ Fuzzy เร็วขึ้น โดยใช้หลาย thread พร้อมๆกัน เช่น ConcurrentRequests=4 จะเร็วขึ้นประมาณ 3 เท่า แต่ใช้ทรัพยากร CPU มากขึ้น

NumberOfMatches=2 คืออะไร?+

จำนวนแถวจาก table2 ที่จะจับคู่กับแถวเดียวจาก table1 ค่า Default คือ 1 (จับ 1 แถวต่อ 1 แถว) ถ้า=2 ได้ 2 แถวต่อ 1 แถว ก็จะเพิ่มแถวผลลัพธ์ไป

Culture parameter ใช้ทำไม?+

ระบุกฎการจับคู่ของภาษา เช่น Culture="ja-JP" สำหรับญี่ปุ่น, "th-TH" สำหรับไทย บางภาษามีกฎการเปรียบเทียบพิเศษ เช่น ตัวอักษรลากหาง ในไทย

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.FuzzyJoin จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้Table.FuzzyJoinTable functions
Table functions (2)
Table.AddFuzzyClusterColumn

Table.AddFuzzyClusterColumn เพิ่มคอลัมน์ใหม่ที่มีค่าตัวแทนสำหรับแต่ละกลุ่ม โดยจับคู่ข้อมูลที่คล้ายกัน แม้จะมีข้อความที่ต่างกัน เช่น การสะกด ตัวอักษรพิมพ์ใหญ่-เล็ก หรือช่องว่าง

Table.Join

Table.Join ใช้รวมตารางสองตารางโดยจับคู่ค่าในคอลัมน์กำหนด สนับสนุนทุกประเภท join (Inner, Left Outer, Right Outer, Full Outer, Anti, Semi) เหมือน SQL Join

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่