INTERSECT คืนตารางของแถวที่อยู่ในทั้ง LeftTable และ RightTable เหมาะกับการหาสิ่งที่ซ้ำกัน/ร่วมกันระหว่างสองชุดข้อมูล โดยรักษาเอาแถวที่ซ้ำกันไว้ด้วย
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| LeftTable | table | ตารางฝั่งซ้าย (ผลลัพธ์จะเก็บชื่อคอลัมน์และ lineage จากตารางนี้) |
| RightTable | table | ตารางฝั่งขวา (ใช้เพื่อเทียบว่าแถวใดอยู่ในตารางนี้ด้วย) |
INTERSECT เป็นฟังก์ชันที่หา “ส่วนร่วม” ของสองตารางเหมือนการหาจุดตัดของเซตในคณิตศาสตร์ มันคืนแถวทั้งหมดที่ปรากฏในทั้ง LeftTable และ RightTable โดยรักษาแถวที่ซ้ำกันจาก LeftTable ไว้ด้วย
ที่เจ๋งคือ INTERSECT ไม่ใช่ commutative – ถ้าสลับตาราง ผลลัพธ์จะต่างออกไป เพราะมันรักษาชื่อคอลัมน์และ lineage จาก LeftTable ทำให้เหมาะกับการตรวจสอบ “ลูกค้าที่อยู่ในทั้งสองระบบ” หรือ “สินค้าที่มีการขายและคืนกลับ” ในข้อมูลจริง
ส่วนตัวผมใช้ INTERSECT เมื่อต้องการหา overlap ระหว่างสองชุดข้อมูล โดยเฉพาะสำหรับการวิเคราะห์ “สิ่งที่ร่วมกัน” ไม่ว่าจะเป็นลูกค้า สินค้า หรือการ์ด membership ผมมักจับคู่ INTERSECT กับ VALUES หรือ SELECTCOLUMNS เพื่อให้ได้ผลลัพธ์ที่ชัดเจนครับ
เช่น เทียบ ProductID จากสองตาราง
เช่น ลูกค้าที่อยู่ในทั้งแคมเปญ A และ B
ใช้ VALUES เพื่อสร้างชุดลูกค้าจากแต่ละโปรแกรม แล้ว INTERSECT หาส่วนร่วม ผลลัพธ์คือลูกค้าที่เป็น overlap ระหว่างสองระบบ
INTERSECT ช่วยหาสินค้าที่ "ปรากฏในทั้งสองตาราง" เป็นวิธีที่เร็วกว่าการใช้ FILTER ที่ซ้อน
INTERSECT หาส่วนร่วม แต่ EXCEPT หาส่วนที่อยู่ในชุดแรกแต่ไม่อยู่ในชุดที่สอง ใช้เมื่อต้องการหา "ส่วนแตกต่าง" แทน
UNION รวม "ทั้งหมด" จากสองตาราง ส่วน INTERSECT หาแต่ "ส่วนร่วม" เลือกใช้ตามความต้องการ
INTERSECT หาแถวที่อยู่ "ในทั้งสอง" ส่วน EXCEPT หาแถวที่อยู่ "ในแรกแต่ไม่อยู่ในที่สอง" ตัวอย่าง: ถ้า A = {1,2,3} และ B = {2,3,4} แล้ว INTERSECT(A,B) = {2,3} ส่วน EXCEPT(A,B) = {1}
UNION รวม "ทั้งหมด" จากสองตาราง (คล้ายการรวมเซต) ส่วน INTERSECT หาแต่ "ส่วนร่วม" (คล้ายจุดตัดเซต) UNION(A,B) = {1,2,3,4} ส่วน INTERSECT(A,B) = {2,3}
ไม่ครับ INTERSECT(A, B) อาจให้ผลต่างจาก INTERSECT(B, A) เพราะมันรักษาชื่อคอลัมน์และ lineage จาก LeftTable เท่านั้น ถ้าตาราง A มีแถวซ้ำ แล้ว INTERSECT(A, B) จะเก็บแถวซ้ำนั้นไว้ ส่วน INTERSECT(B, A) จะเก็บแถวซ้ำจาก B
ใช่ INTERSECT รักษา "แถวที่ซ้ำจาก LeftTable" ถ้า LeftTable มีแถว {A, A, B} และ RightTable มี {A, B, C} ผลลัพธ์คือ {A, A, B} ไม่ใช่ {A, B} ถ้าต้องการลบแถวซ้ำ ให้ใช้ DISTINCT ห่อ INTERSECT ไว้
ควรมีคอลัมน์ที่สอดคล้องกัน (เทียบจำนวน ชนิด และลำดับ) เพราะ INTERSECT เทียบแถวตามตำแหน่งของคอลัมน์ไม่ใช่ชื่อ ถ้าต้องการเทียบเฉพาะบางคอลัมน์ ให้เตรียมตารางด้วย SELECTCOLUMNS ก่อน
ไม่ครับ INTERSECT ไม่ support DirectQuery mode โดยเฉพาะสำหรับ calculated column และ row-level security rules ต้องใช้ Import mode หรือ Dual mode
ฟังก์ชันที่ผู้เขียนโยงไว้กับ INTERSECT จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
DISTINCT คืนค่าตารางที่มีคอลัมน์เดียว ซึ่งประกอบด้วยค่าที่ไม่ซ้ำกันจากคอลัมน์ที่ระบุ โดยไม่รวม Blank Row ที่เกิดจาก Invalid Relationship ความแตกต่างหลักจาก VALUES คือ DISTINCT จะซ่อน Data Quality Issues ในขณะที่ VALUES จะเตือนให้เห็น
EXCEPT คืนตารางของแถวที่อยู่ใน LeftTable แต่ไม่อยู่ใน RightTable เหมาะกับการหาสิ่งที่ขาดหาย เช่น สินค้าที่ไม่เคยขาย ลูกค้าที่ไม่มีธุรกรรม
สร้างตารางใหม่โดยเลือกเฉพาะคอลัมน์ที่ต้องการจากตารางต้นฉบับและเพิ่มคอลัมน์ที่คำนวณได้ ต่างจาก ADDCOLUMNS ตรงที่ SELECTCOLUMNS เริ่มจากตารางว่างแล้วเพิ่มเฉพาะคอลัมน์ที่ระบุ ทำให้สามารถปรับโครงสร้างตารางและเลือกข้อมูลที่จำเป็นได้อย่างยืดหยุ่น
TREATAS เป็นเสมือนการสร้าง "virtual relationship" โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน
UNION รวมหลายตารางให้เป็นตารางเดียวด้วยการต่อแถว โดยเก็บแถวซ้ำไว้ทั้งหมด เหมาะกับการรวมชุดข้อมูลที่มีโครงสร้างคอลัมน์สอดคล้องกัน
VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้
CONTAINS ค้นหาแถวในตารางและคืนค่า TRUE/FALSE เมื่อหาเจอค่าที่ตรงกับเงื่อนไขที่กำหนด เจ๋งเพราะมันเร็วกว่า COUNTROWS + FILTER มาก
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่