استفاده از GENERATE برای INNER JOIN
GENERATE : تابع با دو آرگومان از نوع جدول میگیره و کاملا مشابه CROSSJOIN عمل میکنه و تمام رکوردهای جدول دوم در رکوردهای جدول اول ضرب می شوند از جمله تفاوت های این دو تابع میشه به این موارد اشاره کرد :
- تابع GENERATE تنها دو جدول می پذیرد ولی CROSSJOIN امکان ردیافت بیش از دو جدول رو هم داره
- امکان فیلتر و پیاده سازی JOIN های دیگر در CROSSJOIN وجود ندارد و در تابع GENERATE به خاطر Row Context بودن امکان اعمال فیلتر در سطح سطر را داراست
به طور مثال دو جدول زیر رو به ترتیب با نام های TableA و TableB در نظر بگیرید :
جدول A
ID | Make | Model | Value |
1 | toyota | Corolla | 10 |
2 | hyundai | elantra | 20 |
3 | Ford | Focus | 30 |
جدول B
Make | Model | Year | Index |
toyota | Corolla | 2018 | 100 |
toyota | Corolla | 2018 | 200 |
hyundai | elantra | 2019 | 300 |
hyundai | elantra | 2019 | 400 |
Ford | Focus | 2018 | 500 |
Ford | Focus | 2019 | 600 |
در صورتی که این دو جدول رو در هم ضرب کنیم خواهیم داشت :
1 2 3 4 5 6 7 8 9 10 11 |
crossjoin = CROSSJOIN ( TableA, SELECTCOLUMNS ( TableB, "MakeB", TableB[Make], "ModelB", TableB[Model], "Year", TableB[Year], "Index", TableB[Index] ) ) |
چون نام برخی ستون ها یکسان است برای جلوگیری از خطا نام های جدید به ستون های جدول دوم دادیم.
از خروجی بالا در صورتی که بخواهیم رکوردهایی که مدل و سازنده در هر دو جدول یکسان هستند در جلوی یکدیگر قرار بگیرند دیگه نمیشه از CROSSJOIN استفاده کرد و با GENERATE و استفاده از فیلتر، ستون های برابر رو در نظر می گیریم. در حقیقت INNER JOIN داریم انجام میدیم. کد مد نظر رو میشه به سه شکل با استفاده از توابع یکسان نوشت که در هر حال خروجی یکسان خواهد دش.
روش اول :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
generate_inner_join = GENERATE ( TableA, FILTER ( SELECTCOLUMNS ( TableB, "MakeB", TableB[Make], "ModelB", TableB[Model], "Year", TableB[Year], "Index", TableB[Index] ), TableA[Make] = [MakeB] && TableA[Model] = [ModelB] ) ) |
خروجی اول :
روش دوم :
1 2 3 4 5 6 7 8 9 |
generate_inner_join_2 = GENERATE ( TableA, SELECTCOLUMNS ( FILTER ( TableB, TableA[Make] = [Make] && TableA[Model] = [Model] ), "Year", TableB[Year], "Index", TableB[Index] ) ) |
خروجی دوم :
روش سوم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
generate_inner join_3 = VAR ModifiedTableB = SELECTCOLUMNS ( 'TableB', "My Make", [Make], "My Model", [Model], "Year", [Year], "Index", [Index] ) VAR FilteredGENERATE = FILTER ( GENERATE ( 'TableA', ModifiedTableB ), [Make] = [My Make] && [Model] = [My Model] ) RETURN SELECTCOLUMNS ( FilteredGENERATE, "ID", [ID], "Make", [Make], "Model", [Model], "Year", [Year], "Index", [Index] ) |
خروجی سوم :
مطالب جدید
دستهها
- Books (۱۲)
- Excel (۲)
- اکسل به زبان مثال …! (۹)
- ترفند های پایتونی (۶)
- هوش تجاری (۴۸)
- Power BI (۳۶)
- DAX (۱۳)
- Power Query (۹)
- SQL (۸)
- SSIS (۲)
- Power BI (۳۶)
- یادگیری ماشین (۸)
- ML Algorithm (۲)
- kNN (۲)
- pandas (۵)
- ML Algorithm (۲)
بایگانی
آمار بازدید
- ۰
- ۵
- ۵۲
- ۴۳,۶۲۶
- ۲۷ اردیبهشت, ۱۴۰۳