INTERSECT คืนตารางของแถวที่อยู่ในทั้ง LeftTable และ RightTable เหมาะกับการหาสิ่งที่ซ้ำกัน/ร่วมกันระหว่างสองชุดข้อมูล โดยรักษาเอาแถวที่ซ้ำกันไว้ด้วย
=INTERSECT(<LeftTable>, <RightTable>)
=INTERSECT(<LeftTable>, <RightTable>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| LeftTable | table | Yes | ตารางฝั่งซ้าย (ผลลัพธ์จะเก็บชื่อคอลัมน์และ lineage จากตารางนี้) | |
| RightTable | table | Yes | ตารางฝั่งขวา (ใช้เพื่อเทียบว่าแถวใดอยู่ในตารางนี้ด้วย) |
เช่น เทียบ ProductID จากสองตาราง
เช่น ลูกค้าที่อยู่ในทั้งแคมเปญ A และ B
Customers in Both Programs = VAR ProgACustomers = VALUES( ProgramA[CustomerID] ) VAR ProgBCustomers = VALUES( ProgramB[CustomerID] ) RETURN INTERSECT( ProgACust…Customers in Both Programs =
VAR ProgACustomers = VALUES( ProgramA[CustomerID] )
VAR ProgBCustomers = VALUES( ProgramB[CustomerID] )
RETURN
INTERSECT( ProgACustomers, ProgBCustomers )
ตารางของ CustomerID ที่ปรากฏในทั้ง ProgramA และ ProgramB
Products Sold and Returned = VAR SoldProducts = VALUES( Sales[ProductID] ) VAR ReturnedProducts = VALUES( Returns[ProductID] ) RETURN INTERSECT( SoldProducts, R…Products Sold and Returned =
VAR SoldProducts = VALUES( Sales[ProductID] )
VAR ReturnedProducts = VALUES( Returns[ProductID] )
RETURN
INTERSECT( SoldProducts, ReturnedProducts )
ตารางของ ProductID ที่มีการขายและมีการคืนกลับ
Customers Only in Program A = VAR ProgACustomers = VALUES( ProgramA[CustomerID] ) VAR ProgBCustomers = VALUES( ProgramB[CustomerID] ) RETURN EXCEPT( ProgACustom…Customers Only in Program A =
VAR ProgACustomers = VALUES( ProgramA[CustomerID] )
VAR ProgBCustomers = VALUES( ProgramB[CustomerID] )
RETURN
EXCEPT( ProgACustomers, ProgBCustomers )
ตารางของลูกค้าที่อยู่ใน Program A แต่ไม่อยู่ใน Program B
All Customers from Both Programs = VAR ProgACustomers = VALUES( ProgramA[CustomerID] ) VAR ProgBCustomers = VALUES( ProgramB[CustomerID] ) RETURN UNION( ProgACu…All Customers from Both Programs =
VAR ProgACustomers = VALUES( ProgramA[CustomerID] )
VAR ProgBCustomers = VALUES( ProgramB[CustomerID] )
RETURN
UNION( ProgACustomers, ProgBCustomers )
ตารางของลูกค้าทั้งหมดจากทั้งสองโปรแกรม (รวมกัน)
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 เป็นฟังก์ชันที่หา “ส่วนร่วม” ของสองตารางเหมือนการหาจุดตัดของเซตในคณิตศาสตร์ มันคืนแถวทั้งหมดที่ปรากฏในทั้ง LeftTable และ RightTable โดยรักษาแถวที่ซ้ำกันจาก LeftTable ไว้ด้วย
ที่เจ๋งคือ INTERSECT ไม่ใช่ commutative – ถ้าสลับตาราง ผลลัพธ์จะต่างออกไป เพราะมันรักษาชื่อคอลัมน์และ lineage จาก LeftTable ทำให้เหมาะกับการตรวจสอบ “ลูกค้าที่อยู่ในทั้งสองระบบ” หรือ “สินค้าที่มีการขายและคืนกลับ” ในข้อมูลจริง
ส่วนตัวผมใช้ INTERSECT เมื่อต้องการหา overlap ระหว่างสองชุดข้อมูล โดยเฉพาะสำหรับการวิเคราะห์ “สิ่งที่ร่วมกัน” ไม่ว่าจะเป็นลูกค้า สินค้า หรือการ์ด membership ผมมักจับคู่ INTERSECT กับ VALUES หรือ SELECTCOLUMNS เพื่อให้ได้ผลลัพธ์ที่ชัดเจนครับ