บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

ในบทช่วยสอนนี้ เราจะดูโค้ด DAX บางส่วน คุณอาจเคยใช้สิ่งนี้แล้ว หรือคุณอาจพบและสับสนเกี่ยวกับวิธีการทำงานของโค้ดนี้ และวิธีที่ทั้งบริบทของแถวและบริบทของตัวกรองดูเหมือนจะโต้ตอบกันในโค้ด DAX เดียว ทั้งสองวิธีบทช่วยสอนนี้จะดูรายละเอียดทั้งหมดข้างต้นโดยละเอียด คุณสามารถดูวิดีโอทั้งหมดของบทช่วยสอนนี้ได้ที่ด้านล่างของบล็อกนี้

อันดับแรก เราจะดูที่ตัวโค้ดเอง จากนั้นเราจะพูดถึงส่วนทฤษฎีเพื่อทำความเข้าใจให้ดียิ่งขึ้น สุดท้าย เราจะดูทุกอย่างเบื้องหลังโดยใช้DAX Studio

โมเดลข้อมูลที่เราจะใช้นั้นเป็นโมเดลข้อมูลการขายอย่างง่ายที่มีวันที่ ยอดขาย และตารางผลิตภัณฑ์ ตารางการขายประกอบด้วยธุรกรรมในแต่ละวัน ตารางผลิตภัณฑ์ประกอบด้วยข้อมูลเกี่ยวกับข้อมูลการขายเกี่ยวกับผลิตภัณฑ์ในแต่ละวัน ตารางวันที่มีเพียงไม่กี่คอลัมน์สำหรับจุดประสงค์ของบทช่วยสอนนี้

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

เราสนใจเฉพาะตาราง Dates แต่เรากำลังจะใช้ตาราง Sales และตาราง Products เพื่ออธิบายว่าบริบทตัวกรองและบริบทของแถวเผยแพร่ด้วยความช่วยเหลือของความสัมพันธ์อย่างไร

สารบัญ

บริบทของแถวและบริบทตัวกรองในการวัดผลรวมที่กำลังทำงานอยู่

ตอนนี้ มาสร้างการวัดผลรวมที่กำลังทำงานอยู่ เนื่องจากมีทั้งบริบทแถวและตัวกรอง นี่คือการวัดผลรวมการทำงานพื้นฐาน โดยฉันใช้ COUNTROWS บนตัวกรอง และฟังก์ชัน ALL เพื่อส่งคืนปีทั้งหมดที่ฉันมีในตารางวันที่ เมื่อผมนำมาวัดในตารางด้านล่าง จะเห็นว่าเราได้ผลลัพธ์ตามที่เราคาดไว้

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

ทีนี้มาลองวิเคราะห์ว่าโค้ด DAX นั้นทำงานอย่างไร

ในการวัด คุณจะเห็นว่าอันดับแรก เรามี COUNTROWS แต่นั่นไม่ใช่ฟังก์ชันแรกที่ได้รับการประเมินหรือกำลังดำเนินการ จากนั้นเรามีฟังก์ชัน FILTER แล้วก็ ALL สิ่งแรกในลำดับการประเมินเป็นของทั้งหมด ALL ส่งคืนค่าเฉพาะทั้งหมดของ Dates Calendar Year Number โดยละเว้นบริบทตัวกรองใดๆ ที่มีอยู่นอกฟังก์ชัน ALL

ดังนั้น ในเมตริก เรามีคอลัมน์หมายเลขปีปฏิทิน และกำลังกรองคอลัมน์นั้นอยู่ แต่เนื่องจาก ALL จะไม่สนใจบริบทตัวกรองที่มีอยู่ เราจึงจะได้รับค่าเฉพาะทั้งหมดของคอลัมน์นั้น

ในอาร์กิวเมนต์ที่สอง ในบริบทของแถว เราได้เขียนว่า Dates Calendar Year Number ควรน้อยกว่า MAX Dates Calendar Year Number Number ตอนนี้ หากคุณเป็นมือใหม่และยังคงพยายามทำความเข้าใจและเรียนรู้ DAX คุณอาจคิดว่าทั้งการอ้างอิงทางด้านซ้ายมือและภายในฟังก์ชัน MAX เป็นของคอลัมน์เดียวกันและเป็นตารางเดียวกันกับที่เรามีใน ฟังก์ชั่นทั้งหมด

แต่นั่นไม่เป็นความจริง ส่วนเดียวของบริบทแถวที่เป็นของฟังก์ชัน ALL คือส่วนที่เรามีทางด้านซ้าย สิ่งที่เรามีใน MAX กำลังได้รับการประเมินภายในบริบทของตัวกรอง ไม่ใช่ในบริบทของแถว

ดังนั้น FILTER จะพยายามสร้างบริบทของแถวในตารางที่คุณระบุในอาร์กิวเมนต์แรก และโค้ดส่วนนี้จะถูกดึงมาจากบริบทของแถวนั้นๆ ดังนั้น แต่ละแถว FILTER จะวนซ้ำตารางนั้นที่เรามีใน ALL แล้วเราจะสามารถเข้าถึงค่าทั้งหมดที่เรากำลังวนซ้ำอยู่

ดังนั้น ในการวนซ้ำครั้งแรก เรามีค่าเพียงค่าเดียว ในการวนซ้ำครั้งที่สอง เรามีค่าที่สอง แต่เมื่อเราเขียน MAX มันจะไม่ขึ้นกับบริบทของแถวที่เรากำลังสร้างโดยใช้ฟังก์ชัน FILTER ดังนั้น MAX จึงได้รับการประเมินในบริบทตัวกรองที่ถูกสร้างขึ้นโดยหมายเลขปีปัจจุบันที่เราใช้ในเมทริกซ์นั้น

เมื่อเราอยู่ที่ปี 2549 MAX จะส่งกลับปี 2549 ในขณะที่แถวปัจจุบันสามารถเป็นปี 2549 2550 หรือ 2551 FILTER จะส่งกลับตารางที่ตรงตามเกณฑ์ที่เราระบุในอาร์กิวเมนต์ที่สอง เมื่อเราเลื่อนไปที่ปี 2007 MAX จะส่งกลับปี 2007 ในปี 2008 จะส่งกลับปี 2008 และขึ้นอยู่กับค่าทั้งหมดที่น้อยกว่าค่าที่ฟังก์ชัน MAX ส่งกลับ FILTER จะส่งกลับ โต๊ะ.

เพื่อพิสูจน์ว่า MAX ไม่ได้ขึ้นอยู่กับบริบทของแถว เราสามารถแยกโค้ด DAX ชิ้นนี้ออกเป็นหลายตัวแปรได้ จากนั้นเราจะสามารถเข้าใจได้ว่าการอ้างอิงคอลัมน์ด้านซ้ายและด้านขวาไม่เหมือนกัน

ดังนั้นเรามาสร้างตัวแปรกัน

ดังที่คุณเห็นในหน่วยวัดด้านล่าง ฉันสร้างตัวแปรสามตัว ( ) ฉันเพิ่มรหัส FILTER สุดท้ายด้วยตัวแปรผลลัพธ์ที่ใช้COUNTROWS เมื่อฉันใช้มาตรการนี้ในตารางด้านล่าง คุณจะเห็นว่าไม่มีอะไรเปลี่ยนแปลง ผลลัพธ์ยังคงเหมือนเดิม เรายังคงได้รับผลรวมการวิ่งเท่าเดิมที่เราได้รับก่อนหน้านี้

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

หากเรากลับไปที่โค้ดและพยายามเรียกค่าของตัวแปรตัวแรกและยืนยันตามนั้น คุณจะเห็นว่าสำหรับแต่ละแถว เราได้ปีเดียวกัน

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

ดังนั้น หวังว่าฉันสามารถอธิบายให้คุณฟังได้ว่าฟังก์ชัน MAX ในโค้ดเฉพาะนี้ ไม่ได้ขึ้นอยู่กับบริบทจริงสำหรับค่าของมัน และถ้าคุณต้องการทำให้ความเข้าใจในบริบทการประเมินง่ายขึ้น คุณสามารถแบ่งโค้ดออกเป็นหลายๆ ตัวแปรได้เสมอ เพื่อให้คุณเข้าใจลำดับการประเมินและวิธีดำเนินการโค้ด

ตอนนี้ ฉันต้องการแสดงสถานการณ์ที่ฟังก์ชัน MAX จะขึ้นอยู่กับบริบทของแถวที่สร้างโดยฟังก์ชัน FILTER

ลองกลับไปที่มาตรการนั้น ลองทำซ้ำกัน และแทนที่จะเป็นปีที่แสดงล่าสุด ฉันจะวันที่สูงสุดตามปีปฏิทิน เมื่อฉันนำมันเข้าไปในเมทริกซ์ คุณจะเห็นว่าเราได้ช่องว่าง

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

ทำไม

สิ่งที่เราทำซ้ำทุกปีและสิ่งที่ CALCULATE ทำคือแปลงแถวที่วนซ้ำในปัจจุบันเป็นบริบทตัวกรองที่เทียบเท่า

ถ้าผมเขียนเครื่องหมายเท่ากับตรงนี้ คุณจะเห็นว่าเราได้ 7, 7 และ 7.

ทำไม

ให้ฉันสร้างตารางคำนวณใหม่เพื่อให้คุณเข้าใจสิ่งที่เกิดขึ้นได้ง่าย

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

ฉันจะไปสร้างตารางใหม่ ต่อไป ฉันจะเขียนบนเลขปีปฏิทินทั้งหมด จากนั้น ฉันจะเขียน Max Year จากนั้นฉันจะใช้ CALCULATE มากกว่า MAX ของวันที่ปีปฏิทิน และตอนนี้คุณจะเห็นว่าในแต่ละแถว เรากำลังทำซ้ำค่าเดิม

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

เนื่องจากตัวเลขเหล่านี้ไม่ได้น้อยกว่าตัวเองอย่างเคร่งครัด เราจึงได้รับช่องว่าง แต่เมื่อเราใช้เท่ากับ (=) เรากำลังบอกว่าค่าทั้งหมดที่น้อยกว่าปี 2011 จะได้ 7

ยิ่งไปกว่านั้น แม้ว่าคุณจะใช้การอ้างอิงหน่วยวัด เช่น Max Year รหัสนี้จะใช้งานไม่ได้

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

ถ้ากดยืนยันจะเห็นว่ายังไม่ได้อะไรเลย นี่เป็นเพราะเมื่อเราเขียน Max Year เรากำลังเขียน CALCULATE MAX Dates หมายเลขปีปฏิทิน

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

การอ้างอิงหน่วยวัดจะมี CALCULATE อยู่ข้างนอกเสมอ ดังนั้น มาตรการนี้กำลังเริ่มต้นการเปลี่ยนบริบทที่แปลงแถวที่วนซ้ำในปัจจุบันเป็นบริบทตัวกรอง

แต่ถ้าคุณถูกผูกมัดและต้องใช้การอ้างอิงหน่วยวัด สิ่งที่คุณทำได้คือเก็บหน่วยวัดนั้นไว้ในตัวแปร และอย่างที่คุณทราบ ตัวแปรมีค่าคงที่ และไม่สามารถสร้างการเปลี่ยนบริบทได้ ดังนั้นจึงไม่สามารถแปลงบริบทแถวเป็นบริบทตัวกรองได้

นั่นคือการสาธิตอย่างรวดเร็วว่าบริบทของแถวและบริบทของตัวกรองโต้ตอบกันอย่างไรในโค้ด DAX

ตอนนี้ไปที่ DAX Studio เพื่อทำความเข้าใจสิ่งที่เกิดขึ้นเบื้องหลัง

การใช้ DAX Studio เพื่อทำความเข้าใจบริบทของแถวและบริบทตัวกรอง

ไปที่เครื่องมือภายนอกและเปิดใช้ DAX Studio เรา จำเป็นต้องเชื่อมต่อกับไฟล์ LuckyTemplates ด้วยความช่วยเหลือของQuery PlanและServer Timings

จากนั้น ฉันจะสร้างการวัดแบบสอบถาม ฉันจะเขียน DEFINE MEASURE ในตาราง Dates, Dates Running Total จากนั้นฉันจะใช้รหัสเดิมที่เรามี

เนื่องจากเราควรจะคืนโต๊ะ เราจึงสามารถเขียน EVALUATE ได้ สุดท้าย เราจะสร้างตารางโดยใช้ SUMMARIZECOLUMNS ดังนั้น เราจะเขียน Dates Calendar Year Number และคอลัมน์เสมือน ซึ่งจะเป็น Running Total จากนั้นฉันสามารถเขียนบางอย่างเช่น DT เป็นคีย์เวิร์ด DAX Studio

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

ถ้าฉันเรียกใช้โค้ดนี้ คุณจะเห็นว่าโค้ดเสร็จสมบูรณ์แล้ว และเรายังคงได้รับผลลัพธ์เดียวกันกับที่เราเห็นใน LuckyTemplates

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

ตอนนี้ ไปที่ Query Plan เพื่อทำความเข้าใจว่าเกิดอะไรขึ้นเบื้องหลัง มาดูกันว่าฟังก์ชัน MAX ขึ้นอยู่กับบริบทของแถวหรือไม่ ไปที่แผน Query แบบลอจิคัล เนื่องจากโดยทั่วไปแล้ว Query Plan นั้นซับซ้อนกว่าและอ่านยากสักหน่อย

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

คุณจะเห็นว่าโอเปอเรเตอร์แรกในบรรทัดแรกคือGroupSemiJoinและนั่นใช้โดย SUMMARIZECOLUMNS เพื่อสร้างจุดร่วมภายในระหว่างสองคอลัมน์

จากนั้น สำหรับการรวมคอลัมน์เหล่านั้น มีScan_Vertipaqซึ่งเป็นเครื่องมือจัดเก็บข้อมูลที่เรามีอยู่ในบริการวิเคราะห์ เราจะเห็นว่ามันบอกว่าเราต้องการคอลัมน์ ซึ่งก็คือ Dates Calendar Year Number ใน LuckyTemplates คุณจะเห็นว่าในเมทริกซ์ เรามีคอลัมน์หมายเลขปีปฏิทิน ซึ่งทำหน้าที่เป็นการเข้าถึงรายงานของเรา

ต่อไป เรามีฟังก์ชัน COUNTROWSในการวัดของเราในฐานะตัวดำเนินการระดับบนสุด จากนั้น COUNTROWS จะเรียกใช้ฟังก์ชัน FILTERสำหรับตัวกรอง มีScan_Vertipaqอีกครั้ง ซึ่งระบุว่า RequiredCols คือ Dates Calendar Year Number

บรรทัดที่ 2 และ 5 เหมือนกัน แต่ Scan_Vertipaq บรรทัดแรกมีเครื่องหมาย 0 ในขณะที่บรรทัดที่สองมีเครื่องหมาย 1 นั่นหมายความว่าคอลัมน์ที่เรากำลังเข้าถึงด้วยความช่วยเหลือของฟังก์ชัน ALL จะถูกแยกออกจากคอลัมน์ที่เรามีภายในฟังก์ชัน SUMMARIZECOLUMNS

จากนั้นมีตัวดำเนินการLessThan ในบรรทัดถัดไป เราจะ เห็นว่ามีการเปรียบเทียบระหว่างบริบทของแถวกับฟังก์ชัน MAX

ตามด้วยMax_Vertipaq ดังนั้นเราจึงแยกค่าสูงสุดออกจากเครื่องมือจัดเก็บข้อมูล ทางด้านขวา คุณจะเห็นว่ามีข้อความว่า DependOnCols Dates Calendar Year Number นี่คือสิ่งที่สำคัญที่สุดที่เราต้องจำไว้ ก่อนหน้านี้ ฉันบอกว่าไม่มีการพึ่งพาฟังก์ชัน MAX ในบริบทของแถว และนี่คือสิ่งที่พิสูจน์ได้จริง

และที่นี่บอกว่าเป็นศูนย์

เราพบศูนย์ที่ไหน

ที่ด้านบน (บรรทัดที่สอง) ซึ่งกำลังแยกสำหรับ SUMMARIZECOLUMNS นั่นหมายความว่าฟังก์ชัน MAX ไม่ได้ขึ้นอยู่กับบริบทของแถว แต่จริงๆ แล้วขึ้นอยู่กับคอลัมน์ (หมายเลขปีปฏิทิน) ที่เรามีในตารางนั้น ตารางนั้นกำลังสร้างบริบทตัวกรอง

กล่าวโดยย่อ ฟังก์ชัน MAX ขึ้นอยู่กับบริบทของตัวกรอง ไม่ใช่บริบทของแถว

ต่อไป คุณจะเห็นว่าสำหรับการคำนวณ Max_Vertipaq เรามีScan_Vertipaqซึ่งระบุว่า DependOnCols เป็นศูนย์ (0) วันที่ปีปฏิทิน จากนั้นมีคอลัมน์อื่น ๆ อีกหลายคอลัมน์ที่ต้องการคอลัมน์

ทีนี้มาดูที่ตัวแปรของโค้ดกัน แทนที่จะส่งคืน LastVisibleYear ฉันจะส่งคืนเวอร์ชัน COUNTROWS หรือตัวแปรผลลัพธ์ และคุณจะเห็นว่าเรายังคงได้รับผลลัพธ์เหมือนเดิม

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

หากเราดูที่ Query Plan คุณจะเห็นว่ามันยาวกว่าเล็กน้อย แต่อ่านง่ายกว่ามาก

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

สุดท้าย นี่คือเวอร์ชันที่คำนวณได้ของโค้ดเช่นกัน

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX

และนี่คือลักษณะของ Logical Query Plan

บริบทของแถวและบริบทตัวกรองในรหัส LuckyTemplates DAX


DAX LuckyTemplates: บริบทแถวคืออะไร ความรู้
เบื้องต้นเกี่ยวกับตัวกรองบริบทใน LuckyTemplates
การเปลี่ยนบริบทคืออะไร และเหตุใดจึงมีความสำคัญ

บทสรุป

ในบทช่วยสอนนี้ ฉันได้อธิบายว่าฟังก์ชันที่กำหนดสามารถโต้ตอบและไม่สามารถโต้ตอบกับบริบทของแถวได้อย่างไร ฉันได้แสดงให้คุณเห็นว่า MAX ในกรณีนี้ ได้รับการประเมินอย่างไรในบริบทของตัวกรอง ไม่ใช่ในบริบทของแถว

สิ่งสำคัญคือต้องจำไว้เสมอว่าบริบทตัวกรองจะกรองโมเดลทั้งหมดและบริบทของแถวจะวนซ้ำตารางที่กำหนดเท่านั้นและจะไม่กรองโมเดลนั้น บริบทตัวกรองไม่วนซ้ำตาราง

ฉันหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์ คอยติดตาม รหัส DAX Studio ของเรา ที่เราจะเผยแพร่ในเร็วๆ นี้ เราจะลงลึกมากขึ้นในสถานการณ์ที่คล้ายคลึงกัน นอกจากนี้ เราจะสอนวิธีเพิ่มประสิทธิภาพโค้ด DAX ของคุณ


ตนเองคืออะไรใน Python: ตัวอย่างในโลกแห่งความเป็นจริง

ตนเองคืออะไรใน Python: ตัวอย่างในโลกแห่งความเป็นจริง

ตนเองคืออะไรใน Python: ตัวอย่างในโลกแห่งความเป็นจริง

วิธีบันทึกและโหลดไฟล์ RDS ใน R

วิธีบันทึกและโหลดไฟล์ RDS ใน R

คุณจะได้เรียนรู้วิธีการบันทึกและโหลดวัตถุจากไฟล์ .rds ใน R บล็อกนี้จะครอบคลุมถึงวิธีการนำเข้าวัตถุจาก R ไปยัง LuckyTemplates

เยี่ยมชม N วันทำการแรก – โซลูชันภาษาการเข้ารหัส DAX

เยี่ยมชม N วันทำการแรก – โซลูชันภาษาการเข้ารหัส DAX

ในบทช่วยสอนภาษาการเข้ารหัส DAX นี้ เรียนรู้วิธีใช้ฟังก์ชัน GENERATE และวิธีเปลี่ยนชื่อหน่วยวัดแบบไดนามิก

แสดงข้อมูลเชิงลึกโดยใช้เทคนิคการแสดงภาพแบบไดนามิกแบบหลายเธรดใน LuckyTemplates

แสดงข้อมูลเชิงลึกโดยใช้เทคนิคการแสดงภาพแบบไดนามิกแบบหลายเธรดใน LuckyTemplates

บทช่วยสอนนี้จะครอบคลุมถึงวิธีการใช้เทคนิค Multi Threaded Dynamic Visuals เพื่อสร้างข้อมูลเชิงลึกจากการแสดงข้อมูลแบบไดนามิกในรายงานของคุณ

บทนำในการกรองบริบทใน LuckyTemplates

บทนำในการกรองบริบทใน LuckyTemplates

ในบทความนี้ ฉันจะเรียกใช้ผ่านบริบทตัวกรอง บริบทตัวกรองเป็นหนึ่งในหัวข้อหลักที่ผู้ใช้ LuckyTemplates ควรเรียนรู้ในขั้นต้น

เคล็ดลับที่ดีที่สุดในการใช้แอปใน LuckyTemplates Online Service

เคล็ดลับที่ดีที่สุดในการใช้แอปใน LuckyTemplates Online Service

ฉันต้องการแสดงให้เห็นว่าบริการออนไลน์ของ LuckyTemplates Apps สามารถช่วยในการจัดการรายงานและข้อมูลเชิงลึกต่างๆ ที่สร้างจากแหล่งข้อมูลต่างๆ ได้อย่างไร

วิเคราะห์การเปลี่ยนแปลงอัตรากำไรล่วงเวลา – การวิเคราะห์ด้วย LuckyTemplates และ DAX

วิเคราะห์การเปลี่ยนแปลงอัตรากำไรล่วงเวลา – การวิเคราะห์ด้วย LuckyTemplates และ DAX

เรียนรู้วิธีคำนวณการเปลี่ยนแปลงอัตรากำไรของคุณโดยใช้เทคนิคต่างๆ เช่น การแยกสาขาและการรวมสูตร DAX ใน LuckyTemplates

แนวคิด Materialization สำหรับแคชข้อมูลใน DAX Studio

แนวคิด Materialization สำหรับแคชข้อมูลใน DAX Studio

บทช่วยสอนนี้จะหารือเกี่ยวกับแนวคิดของการทำให้แคชข้อมูลเป็นรูปธรรมและวิธีที่สิ่งเหล่านี้ส่งผลต่อประสิทธิภาพของ DAX ในการให้ผลลัพธ์

การรายงานทางธุรกิจโดยใช้ LuckyTemplates

การรายงานทางธุรกิจโดยใช้ LuckyTemplates

หากคุณยังคงใช้ Excel อยู่จนถึงตอนนี้ นี่เป็นเวลาที่ดีที่สุดในการเริ่มใช้ LuckyTemplates สำหรับความต้องการในการรายงานทางธุรกิจของคุณ

เกตเวย์ LuckyTemplates คืออะไร ทั้งหมดที่คุณต้องการรู้

เกตเวย์ LuckyTemplates คืออะไร ทั้งหมดที่คุณต้องการรู้

เกตเวย์ LuckyTemplates คืออะไร ทั้งหมดที่คุณต้องการรู้