การทําความเข้าใจฟังก์ชัน 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
โดยภาพแล้ว สิ่งที่เกิดขึ้นมีดังนี้:
ตาราง แสดง ตามปีปฏิทิน
ก่อนอื่น การเรียกไปยัง 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