แชร์ผ่าน


ทําความเข้าใจฟังก์ชัน ORDERBY, PARTITIONBY และ MATCHBY

ฟังก์ชัน ORDERBY, PARTITIONBY และ MATCHBY ใน DAX เป็นฟังก์ชันพิเศษที่สามารถใช้ได้พร้อมกับฟังก์ชันหน้าต่าง DAX เท่านั้น: INDEX, OFFSET, WINDOW, RANK, ROWNU เมกะไบต์ ER

การทําความเข้าใจ ORDERBY, PARTITIONBY และ MATCHBY มีความสําคัญต่อการใช้ฟังก์ชัน Window ให้สําเร็จ ตัวอย่างที่ให้ไว้ที่นี่ใช้ OFFSET แต่สามารถใช้กับฟังก์ชัน Window อื่น ๆ ได้

สถานการณ์สมมติ

มาเริ่มต้นด้วยตัวอย่างที่ไม่ใช้ฟังก์ชัน Window เลยกัน แสดงด้านล่างคือตารางที่ส่งกลับยอดขายทั้งหมด ต่อสี ต่อปีปฏิทิน มีหลายวิธีในการกําหนดตารางนี้ แต่เนื่องจากเราสนใจที่จะทําความเข้าใจสิ่งที่เกิดขึ้นใน DAX เราจะใช้ตารางจากการคํานวณ นี่คือนิพจน์ตาราง:

BasicTable = 
    SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
    )

คุณจะเห็นนิพจน์ตารางจากการคํานวณนี้ใช้ SUMMARIZECOLUMNS เพื่อคํานวณ SUM ของคอลัมน์ SalesAmount ในตาราง FactInternetSales ตามคอลัมน์สีจากตาราง DimProduct และคอลัมน์ CalendarYear จากตาราง DimDate นี่คือผลลัพธ์:

สี CalendarYear CurrentYearSales
"สีดํา" 2017 393885
"สีดํา" 2018 1818835
"สีดํา" 2019 3981638
"สีดํา" 2020 2644054
"สีน้ําเงิน" 2019 994448
"สีน้ําเงิน" 2020 1284648
"Multi" 2019 48622
"Multi" 2020 57849
"NA" 2019 207822
"NA" 2020 227295
"สีแดง" 2017 2961198
"สีแดง" 2018 3686935
"สีแดง" 2019 900175
"สีแดง" 2020 176022
"ซิลเวอร์" 2017 326399
"ซิลเวอร์" 2018 750026
"ซิลเวอร์" 2019 2165176
"ซิลเวอร์" 2020 1871788
"สีขาว" 2019 2517
"สีขาว" 2020 2589
"สีเหลือง" 2018 163071
"สีเหลือง" 2019 2072083
"สีเหลือง" 2020 2621602

ตอนนี้มาลองจินตนาการว่าเรากําลังพยายามแก้ปัญหาคําถามทางธุรกิจของการคํานวณความแตกต่างของยอดขายในแต่ละปีสําหรับแต่ละสี อย่างมีประสิทธิภาพ เราต้องการวิธีการค้นหายอดขายสําหรับสีเดียวกันในปีก่อนหน้า และลบออกจากยอดขายในปีปัจจุบันในบริบท ตัวอย่างเช่น สําหรับการรวม [Red, 2019] เรากําลังค้นหายอดขายสําหรับ [Red, 2018] เมื่อเรามีแล้ว เราสามารถลบออกจากยอดขายปัจจุบันและส่งกลับค่าที่ต้องการได้

การใช้ OFFSET

OFFSET เหมาะสําหรับการเปรียบเทียบทั่วไป กับการคํานวณประเภทก่อนหน้า ที่จําเป็นในการตอบคําถามทางธุรกิจที่อธิบายไว้ข้างต้นเนื่องจากช่วยให้เราสามารถเคลื่อนไหวเชิงสัมพันธ์ได้ ความพยายามครั้งแรกของเราอาจเป็น:

1stAttempt = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation
            ),
            [CurrentYearSales]
        )
    )

เกิดเรื่องมากมายกับนิพจน์นี้ เราใช้ ADDCOLUMNS เพื่อขยายตารางจากก่อนหน้านี้ด้วยคอลัมน์ที่ชื่อว่า PreviousColorSales เนื้อหาของคอลัมน์นั้นจะถูกตั้งค่าเป็น CurrentYearSales ซึ่งเป็น SUM(FactInternetSales[SalesAmount]) สําหรับสีก่อนหน้า (เรียกใช้โดยใช้ OFFSET)

ผลลัพธ์คือ:

สี CalendarYear CurrentYearSales PreviousColorSales
"สีดํา" 2017 393885
"สีดํา" 2018 1818835 393885
"สีดํา" 2019 3981638 1818835
"สีดํา" 2020 2644054 3981638
"สีน้ําเงิน" 2019 994448 2644054
"สีน้ําเงิน" 2020 1284648 994448
"Multi" 2019 48622 1284648
"Multi" 2020 57849 48622
"NA" 2019 207822 57849
"NA" 2020 227295 207822
"สีแดง" 2017 2961198 227295
"สีแดง" 2018 3686935 2961198
"สีแดง" 2019 900175 3686935
"สีแดง" 2020 176022 900175
"ซิลเวอร์" 2017 326399 176022
"ซิลเวอร์" 2018 750026 326399
"ซิลเวอร์" 2019 2165176 750026
"ซิลเวอร์" 2020 1871788 2165176
"สีขาว" 2019 2517 1871788
"สีขาว" 2020 2589 2517
"สีเหลือง" 2018 163071 2589
"สีเหลือง" 2019 2072083 163071
"สีเหลือง" 2020 2621602 2072083

นี่เป็นก้าวเดียวที่ใกล้เป้าหมายของเรา แต่ถ้าเรามองอย่างใกล้ชิด มันจะไม่ตรงกับสิ่งที่เรากําลังตามมา ตัวอย่างเช่น สําหรับ [Silver, 2017] PreviousColorSales ถูกตั้งค่าเป็น [Red, 2020]

การเพิ่ม ORDERBY

ข้อกําหนดข้างต้นเทียบเท่ากับ:

1stAttemptWithORDERBY = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([Color], ASC, [CalendarYear], ASC, [CurrentYearSales], ASC)      
            ),
            [CurrentYearSales]
        )
    )

ในกรณีนี้ การเรียก OFFSET ใช้ ORDERBY เพื่อเรียงลําดับตารางตามสีและ CalendarYear จากน้อยไปหามาก ซึ่งจะกําหนดสิ่งที่จะพิจารณาว่าเป็นแถวก่อนหน้าที่ส่งกลับ

เหตุผลสองผลลัพธ์นี้เทียบเท่ากันคือ เนื่องจาก ORDERBY ประกอบด้วยคอลัมน์ทั้งหมดจากความสัมพันธ์ที่ไม่ได้อยู่ใน PARTITIONBY โดยอัตโนมัติ เนื่องจากไม่ได้ระบุ PARTITIONBY ORDERBY จะถูกตั้งค่าเป็น Color, CalendarYear และ CurrentYearSales อย่างไรก็ตาม เนื่องจากคู่สีและ CalendarYear ในความสัมพันธ์จะไม่ซ้ํากัน การเพิ่ม CurrentYearSales จะไม่เปลี่ยนแปลงผลลัพธ์ อันที่จริงแล้ว แม้ว่าเราจะระบุ สี ใน ORDERBY เท่านั้น ผลลัพธ์จะเหมือนกันเนื่องจาก CalendarYear จะถูกเพิ่มโดยอัตโนมัติ ทั้งนี้เนื่องจากฟังก์ชันจะเพิ่มคอลัมน์มากเท่าที่จําเป็นสําหรับ ORDERBY เพื่อให้แน่ใจว่าแต่ละแถวสามารถระบุได้เฉพาะโดยคอลัมน์ ORDERBY และ PARTITIONBY:

1stAttemptWithORDERBY = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS(
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

เพิ่ม PARTITIONBY

ในตอนนี้ เมื่อต้องการ เกือบ ได้รับผลลัพธ์ที่เราหลังจากที่เราสามารถใช้ PARTITIONBY ได้ ดังที่แสดงในนิพจน์ตารางจากการคํานวณต่อไปนี้:

UsingPARTITIONBY = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]), 
                PARTITIONBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

โปรดสังเกตว่าการระบุ ORDERBY เป็นตัวเลือกที่นี่เนื่องจาก ORDERBY จะประกอบด้วยคอลัมน์ทั้งหมดจากความสัมพันธ์ที่ไม่ได้ระบุใน PARTITIONBY โดยอัตโนมัติ ดังนั้น นิพจน์ต่อไปนี้จะให้ผลลัพธ์เดียวกันเนื่องจาก ORDERBY ถูกตั้งค่าเป็น CalendarYear และ CurrentYearSales โดยอัตโนมัติ:

UsingPARTITIONBYWithoutORDERBY = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                PARTITIONBY ([Color])
            ),
            [CurrentYearSales]
        )
    )


หมายเหตุ

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

นิพจน์ทั้งสองจะส่งกลับผลลัพธ์ที่เราอยู่หลังจาก:

สี CalendarYear CurrentYearSales PreviousYearSalesForSameColor
"สีดํา" 2017 393885
"สีดํา" 2018 1818835 393885
"สีดํา" 2019 3981638 1818835
"สีดํา" 2020 2644054 3981638
"สีน้ําเงิน" 2019 994448
"สีน้ําเงิน" 2020 1284648 994448
"Multi" 2019 48622
"Multi" 2020 57849 48622
"NA" 2019 207822
"NA" 2020 227295 207822
"สีแดง" 2017 2961198
"สีแดง" 2018 3686935 2961198
"สีแดง" 2019 900175 3686935
"สีแดง" 2020 176022 900175
"ซิลเวอร์" 2017 326399
"ซิลเวอร์" 2018 750026 326399
"ซิลเวอร์" 2019 2165176 750026
"ซิลเวอร์" 2020 1871788 2165176
"สีขาว" 2019 2517
"สีขาว" 2020 2589 2517
"สีเหลือง" 2018 163071
"สีเหลือง" 2019 2072083 163071
"สีเหลือง" 2020 2621602 2072083

ตามที่คุณเห็นในตารางนี้ คอลัมน์ PreviousYearSalesForSameColor จะแสดงยอดขายสําหรับปีก่อนหน้าสําหรับสีเดียวกัน สําหรับ [Red, 2020] จะส่งกลับยอดขายสําหรับ [Red, 2019] และอื่น ๆ ถ้าไม่มีปีก่อนหน้า ตัวอย่างเช่น ในกรณีของ [Red, 2017] จะไม่มีการส่งกลับค่า

คุณสามารถนึกภาพของ PARTITIONBY เป็นวิธีในการแบ่งตารางออกเป็นส่วน ๆ เพื่อดําเนินการคํานวณ OFFSET ในตัวอย่างด้านบน ตารางจะถูกแบ่งออกเป็นหลายส่วนตามที่มีสี หนึ่งสําหรับแต่ละสี จากนั้น ภายในแต่ละส่วน OFFSET จะถูกคํานวณ โดยเรียงลําดับตาม CalendarYear

โดยภาพแล้ว สิ่งที่เกิดขึ้นมีดังนี้:

Table showing OFFSET by Calendar Year

ก่อนอื่น การเรียกไปยัง PARTITIONBY จะแสดงผลในตารางที่แบ่งออกเป็นส่วน ๆ หนึ่งสําหรับแต่ละสี ซึ่งจะแสดงด้วยกล่องสีน้ําเงินอ่อนในรูปตาราง ถัดไป ORDERBY ทําให้แน่ใจว่าแต่ละส่วนจะเรียงลําดับตาม CalendarYear (แสดงด้วยลูกศรสีส้ม) สุดท้าย ภายในแต่ละส่วนที่เรียงลําดับ สําหรับแต่ละแถว OFFSET จะค้นหาแถวด้านบนและส่งกลับค่านั้นในคอลัมน์ PreviousYearSalesForSameColor เนื่องจากทุกแถวแรกในแต่ละส่วนไม่มีแถวก่อนหน้าในส่วนเดียวกัน ผลลัพธ์ในแถวนั้นสําหรับคอลัมน์ PreviousYearSalesForSameColor จะว่างเปล่า

เพื่อให้ได้ผลลัพธ์สุดท้าย เราเพียงแค่ลบ CurrentYearSales จากยอดขายปีก่อนหน้าสําหรับสีเดียวกันที่ส่งกลับโดยการเรียก OFFSET เนื่องจากเราไม่สนใจที่จะแสดงยอดขายของปีก่อนหน้าสําหรับสีเดียวกัน แต่เฉพาะในยอดขายของปีปัจจุบันและความแตกต่างของปีต่อปีเท่านั้น นี่คือนิพจน์ตารางจากการคํานวณขั้นสุดท้าย:

FinalResult = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "YoYSalesForSameColor",
        [CurrentYearSales] -
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]),
                PARTITIONBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

และนี่คือผลลัพธ์ของนิพจน์นั้น:

สี CalendarYear CurrentYearSales YoYSalesForSameColor
"สีดํา" 2017 393885 393885
"สีดํา" 2018 1818835 1424950
"สีดํา" 2019 3981638 2162803
"สีดํา" 2020 2644054 -1337584
"สีน้ําเงิน" 2019 994448 994448
"สีน้ําเงิน" 2020 1284648 290200
"Multi" 2019 48622 48622
"Multi" 2020 57849 9227
"NA" 2019 207822 207822
"NA" 2020 227295 19473
"สีแดง" 2017 2961198 2961198
"สีแดง" 2018 3686935 725737
"สีแดง" 2019 900175 -2786760
"สีแดง" 2020 176022 -724153
"ซิลเวอร์" 2017 326399 326399
"ซิลเวอร์" 2018 750026 423627
"ซิลเวอร์" 2019 2165176 1415150
"ซิลเวอร์" 2020 1871788 -293388
"สีขาว" 2019 2517 2517
"สีขาว" 2020 2589 72
"สีเหลือง" 2018 163071 163071
"สีเหลือง" 2019 2072083 1909012
"สีเหลือง" 2020 2621602 549519

การใช้ MATCHBY

คุณอาจสังเกตเห็นว่าเราไม่ได้ระบุ MATCHBY เลย ในกรณีนี้ไม่จําเป็น คอลัมน์ใน ORDERBY และ PARTITIONBY (ตามที่ระบุไว้ในตัวอย่างด้านบน) เพียงพอที่จะระบุแต่ละแถวที่ไม่ซ้ํากัน เนื่องจากเราไม่ได้ระบุ MATCHBY คอลัมน์ที่ระบุใน ORDERBY และ PARTITIONBY จะถูกใช้เพื่อระบุเฉพาะแต่ละแถวเพื่อให้สามารถเปรียบเทียบกับการเปิดใช้งาน OFFSET เพื่อให้ได้ผลลัพธ์ที่มีความหมาย ถ้าคอลัมน์ใน ORDERBY และ PARTITIONBY ไม่สามารถระบุเฉพาะของแต่ละแถวได้ จะสามารถเพิ่มคอลัมน์เพิ่มเติมไปยังส่วนคําสั่ง ORDERBY ได้หากคอลัมน์เพิ่มเติมเหล่านั้นอนุญาตให้ระบุแต่ละแถวโดยเฉพาะ ถ้าไม่สามารถทําได้ ข้อผิดพลาดจะถูกส่งกลับ ในกรณีสุดท้ายนี้ การระบุ MATCHBY อาจช่วยแก้ไขข้อผิดพลาดได้

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

ดําเนินการต่อจากตัวอย่างข้างต้น นี่คือนิพจน์สุดท้าย:

FinalResult = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "YoYSalesForSameColor",
        [CurrentYearSales] -
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]),
                PARTITIONBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

หากเราต้องการระบุแถวอย่างไม่ซ้ํากันว่าควรระบุแถวอย่างไร เราสามารถระบุ MATCHBY ดังที่แสดงในนิพจน์ที่เทียบเท่าต่อไปนี้:

FinalResultWithExplicitMATCHBYOnColorAndCalendarYear = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "YoYSalesForSameColor",
        [CurrentYearSales] -
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]),
                PARTITIONBY ([Color]),
                MATCHBY ([Color], [CalendarYear])
            ),
            [CurrentYearSales]
        )
    )

เนื่องจากมีการระบุ MATCHBY ทั้งคอลัมน์ที่ระบุใน MATCHBY เช่นเดียวกับใน PARTITIONBY จะถูกใช้เพื่อระบุแถวที่ไม่ซ้ํากัน เนื่องจากมีการระบุสีในทั้ง MATCHBY และ PARTITIONBY นิพจน์ต่อไปนี้จะเทียบเท่ากับนิพจน์ก่อนหน้า:

FinalResultWithExplicitMATCHBYOnCalendarYear = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "YoYSalesForSameColor",
        [CurrentYearSales] -
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]),
                PARTITIONBY ([Color]),
                MATCHBY ([CalendarYear])
            ),
            [CurrentYearSales]
        )
    )

เนื่องจากการระบุ MATCHBY ไม่จําเป็นสําหรับตัวอย่างที่เราได้พิจารณา มาดูตัวอย่างที่แตกต่างกันเล็กน้อยที่ต้องใช้ MATCHBY ในกรณีนี้ เรามีรายการของบรรทัดใบสั่ง แต่ละแถวแสดงถึงบรรทัดใบสั่งสําหรับคําสั่งซื้อ ใบสั่งหนึ่งๆ สามารถมีบรรทัดใบสั่งและบรรทัดใบสั่ง 1 หลายบรรทัดบนใบสั่งหลายใบได้ นอกจากนี้ สําหรับแต่ละบรรทัดคําสั่ง เรามี ProductKey และ SalesAmount ตัวอย่างของคอลัมน์ที่เกี่ยวข้องในตารางมีลักษณะดังนี้:

SalesOrderNumber SalesOrderLineNumber ProductKey SalesAmount
SO51900 1 528 4.99
SO51948 1 528 5.99
SO52043 1 528 4.99
SO52045 1 528 4.99
SO52094 1 528 4.99
SO52175 1 528 4.99
SO52190 1 528 4.99
SO52232 1 528 4.99
SO52234 1 528 4.99
SO52234 2 529 3.99

สังเกตว่า SalesOrderNumber และ SalesOrderLineNumber จําเป็นต้องใช้ในการระบุแถวที่ไม่ซ้ํากัน

สําหรับแต่ละคําสั่งซื้อ เราต้องการส่งคืนยอดขายก่อนหน้าของผลิตภัณฑ์เดียวกัน (แสดงด้วย ProductKey) ที่เรียงลําดับตาม SalesAmount ในลําดับจากมากไปหาน้อย นิพจน์ต่อไปนี้จะไม่ทํางานเนื่องจากมีแถวหลายแถวใน vRelation ตามที่ส่งผ่านไปยัง OFFSET:

ThisExpressionFailsBecauseMATCHBYIsMissing = 
    ADDCOLUMNS (
        FactInternetSales,
        "Previous Sales Amount",
            SELECTCOLUMNS (
                OFFSET (
                    -1,
                    FactInternetSales,
                    ORDERBY ( FactInternetSales[SalesAmount], DESC ),
                    PARTITIONBY ( FactInternetSales[ProductKey] )
                ),
                FactInternetSales[SalesAmount]
            )
    )

นิพจน์นี้แสดงข้อผิดพลาด: "พารามิเตอร์ความสัมพันธ์ของ OFFSET อาจมีแถวที่ซ้ํากันซึ่งไม่ได้รับอนุญาต"

เพื่อให้นิพจน์นี้ใช้งานได้ ต้องระบุ MATCHBY และต้องรวมคอลัมน์ทั้งหมดที่กําหนดแถวที่ไม่ซ้ํากัน ต้องใช้ MATCHBY ที่นี่เนื่องจากความสัมพันธ์ FactInternetSales ไม่มีคีย์ที่ชัดเจนหรือคอลัมน์ที่ไม่ซ้ํากัน อย่างไรก็ตาม คอลัมน์ SalesOrderNumber และ SalesOrderLineNumber รวมกันเป็น คีย์แบบรวม โดยที่การมีอยู่ร่วมกันจะไม่ซ้ํากันในความสัมพันธ์ และสามารถระบุแต่ละแถวได้อย่างไม่ซ้ํากัน เพียงแค่ระบุ SalesOrderNumber หรือ SalesOrderLineNumber ไม่เพียงพอเนื่องจากทั้งสองคอลัมน์มีค่าซ้ํากัน นิพจน์ต่อไปนี้สามารถแก้ไขปัญหาได้:

ThisExpressionWorksBecauseOfMATCHBY = 
    ADDCOLUMNS (
        FactInternetSales,
        "Previous Sales Amount",
            SELECTCOLUMNS (
                OFFSET (
                    -1,
                    FactInternetSales,
                    ORDERBY ( FactInternetSales[SalesAmount], DESC ),
                    PARTITIONBY ( FactInternetSales[ProductKey] ),
                    MATCHBY ( FactInternetSales[SalesOrderNumber], 
                                FactInternetSales[SalesOrderLineNumber] )
                ),
                FactInternetSales[SalesAmount]
            )
    )

และนิพจน์นี้จะส่งกลับผลลัพธ์ที่เราอยู่หลังจาก:

SalesOrderNumber SalesOrderLineNumber ProductKey SalesAmount ยอดขายก่อนหน้า
SO51900 1 528 5.99
SO51948 1 528 4.99 5.99
SO52043 1 528 4.99 4.99
SO52045 1 528 4.99 4.99
SO52094 1 528 4.99 4.99
SO52175 1 528 4.99 4.99
SO52190 1 528 4.99 4.99
SO52232 1 528 4.99 4.99
SO52234 1 528 4.99 4.99
SO52234 2 529 3.99

ORDERBY
PARTITIONBY
MATCHBY
ดัชนี
ออฟเซ็ต
หน้าต่าง
อันดับ
ROWNU เมกะไบต์ ER