KEEPFILTERS เป็นฟังก์ชันปรับตัวกรองที่ใช้ภายใน CALCULATE เพื่อ “คงตัวกรองเดิมไว้” แล้วนำตัวกรองใหม่มารวมกันแบบ AND (ตัดกันเฉพาะส่วนที่ตรงกัน) แทนพฤติกรรมปกติที่มักเขียนทับตัวกรองเดิมของคอลัมน์เดียวกัน
=KEEPFILTERS(<filter>)
=KEEPFILTERS(<filter>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| filter | table/boolean | Yes | นิพจน์ตัวกรอง (ได้ทั้ง Boolean Filter หรือ Table Expression) ที่ต้องการนำไปรวมกับตัวกรองเดิมใน Context |
ถ้าผู้ใช้เลือกสินค้าใน Slicer แล้วอยากจะดูว่าในกลุ่มสินค้านั้นมี 'สีแดง' ขายได้เท่าไหร่
เมื่อต้องการให้ตัวกรองจาก Measure และตัวกรองจาก Context ทำงานร่วมกันแบบ AND
Red Sales = CALCULATE( [Total Sales], KEEPFILTERS('Product'[Color] = "Red") )Red Sales = CALCULATE( [Total Sales], KEEPFILTERS('Product'[Color] = "Red") )
ยอดขายเฉพาะสินค้าสีแดง ภายใน Context ที่ถูกกรองอยู่แล้ว
// ❌ CALCULATE ปกติ (Override) Brand A Sales Without KEEP = CALCULATE([Total Sales], 'Product'[Brand] = "Brand A") // ✅ CALCULATE + KEEPFILTERS (Intersection) B…=// ❌ CALCULATE ปกติ (Override)
Brand A Sales Without KEEP =
CALCULATE([Total Sales], 'Product'[Brand] = "Brand A")
// ✅ CALCULATE + KEEPFILTERS (Intersection)
Brand A Sales With KEEP =
CALCULATE([Total Sales], KEEPFILTERS('Product'[Brand] = "Brand A"))
// Context: Sales table มี columns Brand, Amount
// User เลือก Brand B, C จาก Slicer
// Without KEEP: ยอดขาย Brand A ทั้งหมด 50,000 (Overwrite Slicer)
// With KEEP: BLANK หรือ 0 (Intersection - A ไม่ตรงกับ B,C)
Slicer เลือก Brand B, C:
- Without KEEP: 50,000 (ยอดขาย Brand A ทั้งหมด)
- With KEEP: BLANK (ไม่มี A ในการเลือก)
Top 10 Sales = CALCULATE( [Total Sales], KEEPFILTERS( TOPN(10, ALL('Product'), [Total Sales]) ) )Top 10 Sales =
CALCULATE(
[Total Sales],
KEEPFILTERS( TOPN(10, ALL('Product'), [Total Sales]) )
)
ยอดขายสินค้า 10 อันดับแรก ภายในหมวดหมู่ที่เลือก
State Intersection Sales = CALCULATE( CALCULATE([Total Sales], 'Geography'[State] = "WA" || 'Geography'[State] = "OR" ), KEEPFILTERS('Geography'[State] = "WA" |…State Intersection Sales =
CALCULATE(
CALCULATE([Total Sales],
'Geography'[State] = "WA" || 'Geography'[State] = "OR"
),
KEEPFILTERS('Geography'[State] = "WA" || 'Geography'[State] = "BC")
)
// Context: Inner CALCULATE ต้องการ WA หรือ OR
// Outer KEEPFILTERS จำกัดเพิ่มเติมว่า WA หรือ BC
// ผลลัพธ์: Intersection = WA เท่านั้น
ยอดขายสำหรับ WA เท่านั้น (WA|OR ∩ WA|BC = WA)
ใช่ KEEPFILTERS เป็น Filter Modifier ที่ออกแบบมาเพื่อทำงานร่วมกับ CALCULATE เท่านั้น
โดยปกติ Boolean Filter ใน CALCULATE มัก “เขียนทับ” ตัวกรองเดิมของคอลัมน์นั้น (Override) แต่เมื่อครอบด้วย KEEPFILTERS จะกลายเป็นการ “คงตัวกรองเดิม” และนำเงื่อนไขใหม่มารวมกันแบบ AND ทำให้ผลลัพธ์แคบลงตามทั้งสองเงื่อนไข
ถ้าตัวกรองเดิมและตัวกรองใหม่ไม่มีส่วนตัดกัน (เช่น Slicer เลือก Brand B,C แต่คุณใส่ KEEPFILTERS(Brand = “A”)) ผลลัพธ์จะไม่มีแถวที่ผ่านเงื่อนไข จึงมักได้ BLANK หรือ 0 ขึ้นกับ Measure
ใช้เมื่อ TOPN สร้างตารางผู้ชนะ (เช่น Top 10) แล้วคุณต้องการให้ผลลัพธ์ยังเคารพตัวกรองเดิม (เช่น หมวดหมู่/ภูมิภาคที่ผู้ใช้เลือก) โดยให้ TOPN ทำงานภายในกรอบของ Context เดิม ไม่ใช่ดึง Top ทั้งบริษัท
KEEPFILTERS เป็นฟังก์ชัน Filter Modifier ที่ใช้ภายใน CALCULATE (หรือ CALCULATETABLE) เพื่อ คงตัวกรองเดิมที่มีอยู่ ไม่ให้ถูกเขียนทับ (Overwrite) ด้วยตัวกรองใหม่ที่เราใส่เข้าไปใน CALCULATE
โดยปกติแล้ว เมื่อเราใส่ Filter ใน CALCULATE ตัวกรองเหล่านั้นจะ Overwrite ตัวกรองเดิมที่อยู่ใน Context (เช่น เมื่อใช้ Slicer เลือก WA และเขียน CALCULATE(measure, state=”OR”) ผลลัพธ์จะเป็น OR ไม่ใช่ WA) แต่ KEEPFILTERS จะเปลี่ยนพฤติกรรมนั้นให้เป็นการนำตัวกรองเดิมและตัวกรองใหม่มาตัดกัน (Intersection / AND Logic) ดังนั้นจะได้เฉพาะส่วนที่ตรงกัน
ทำงานได้ดีกับ Iterator Functions (SUMX, AVERAGEX, MAXX ฯลฯ) ที่ต้องการ Preserve ตัวกรองข้างนอก ขณะที่ Iterate ผ่านแต่ละแถว
ส่วนตัวผม เห็นว่า KEEPFILTERS เป็นเครื่องมือที่ทรงพลังสำหรับการควบคุม Filter Context ใน Dashboard ที่ซับซ้อน เพราะมันอนุญาตให้คุณเพิ่มเงื่อนไขโดยไม่ยุบลงตัวกรองที่ผู้ใช้เลือกไว้แล้ว 😎