แชร์ผ่าน


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

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

การทําความเข้าใจ 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 เพื่อเรียงลําดับตารางตาม Color และ CalendarYear จากน้อยไปหามาก ซึ่งจะกําหนดว่าจะมีการพิจารณาอะไรเป็นแถวก่อนหน้าที่ส่งกลับ

เหตุผลสองผลลัพธ์นี้เทียบเท่ากันคือเนื่องจาก ORDERBY มีคอลัมน์ทั้งหมดจากความสัมพันธ์ที่ไม่ได้อยู่ใน PARTITIONBYโดยอัตโนมัติ เนื่องจากไม่ได้ระบุ PARTITIONBYORDERBY จะถูกตั้งค่าเป็น สี, 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 INDEX OFFSET WINDOW RANK ROWNUMBER