dax row context

زمینه سطر (Row Context) در DAX به صورت تصویری

0 دقیقه

زمان مطالعه

5

1 رای

۱۲۸

بازدید

۱۴۰۵/۵/۳۱

تاریخ انتشار

مقدمه ای بر زمینه سطر (row context) در DAX

در این مطلب زمینه سطر (Row Context) در DAX به صورت تصویری آشنا خواهید شد. بسیاری از افراد تازه‌وارد در کدنویسی DAX، کار خود را با ایجاد ستون‌های محاسباتی ساده آغاز می‌کنند. در این مرحله، تجربه نوشتن فرمول‌ها شباهت زیادی به اکسل دارد: می‌توانید به ستون‌ها ارجاع دهید، توابع را اضافه کنید و از توانایی‌های DAX بهره ببرید. اما با ورود به دنیای مژرهای محاسباتی، همه چیز به سرعت تغییر می‌کند. کدهایی که در یک ستون محاسباتی به راحتی قابل درک بودند، در یک مژر کارایی خود را از دست می‌دهند. دلیل این چالش‌ها عدم آشنایی با مفاهیم زمینه سطر (Row Context) در DAX و زمینه فیلتر (Filter Context) در DAX یا به صورت کلی زمینه های ارزیابی در DAX است. یک ستون محاسباتی در یک زمینه سطر موجود محاسبه می‌شود که به طور خودکار توسط DAX ایجاد می‌شود. وجود این زمینه سطر، نوشتن کد DAX را آسان‌تر می‌کند. در مقابل، مژرها زمینه سطر ندارند و به همین دلیل برای افراد تازه‌وارد دشوارتر هستند. برای نوشتن DAX به نحو مؤثر و جلوگیری از ناامیدی ناشی از اعداد نادرست یا خطاهای غیرمنتظره، درک روشنی از زمینه سطر و زمینه فیلتر و نحوه استفاده از آن‌ها در فرمول‌های DAX ضروری است. در این مقاله، ما بر روی مفهوم زمینه سطر تمرکز می‌کنیم تا به خوانندگان کمک کنیم تا با این مفاهیم آشنا شوند و به راحتی از توانایی‌های DAX بهره ببرند. پیش‌نیاز درک کامل مفاهیم ارائه شده در این مقاله، آشنایی کامل با مفاهیم زمینه‌های ارزیابی در DAX می‌باشد که در مقاله زمینه‌های ارزیابی (Evaluation Context) در DAX به طور کامل مورد بررسی قرار گرفته‌است.

این مقاله را باید بارها و بارها مطالعه کنید و هر چقدر با توابع بیشتری از DAX آشنا شوید، درک این مطلب برای شما ساده‌تر خواهد شد.

یک ارجاع ستونی، به زمینه سطر نیاز دارد

در میان زمینه‌های ارزیابی، زمینه سطر (Row Context) در DAX ساده‌ترین است. زمینه سطر به DAX می‌گوید هنگام نیاز به به دست آوردن مقدار یک ستون، از کدام سطر استفاده کند. می‌توانید زمینه سطر را به عنوان "سطر فعلی" در یک جدول در نظر بگیرید. قبل از توضیح بیشتر در مورد زمینه سطر، مهم است که درک کنیم چرا زمینه سطر بسیار مهم است. در حالت معمول وقتی در جدول پاور پیوت (در اکسل، پاور بی آی یا SSAS) یک ستون محاسباتی ایجاد می‌کنید، فرمول نوشته شده در آن ستون، سطر به سطر اجرا می‌شود. برای مثال جدول زیر را در نظر بگیرید. اگر در ستون NetPrice فرمول زیر را بنویسید، این فرمول سطر به سطر اجرا شده و در هر سطر ضرب مقدار UnitPrice در Quantity را محاسبه می‌کند. بر خلاف اکسل که شما از شماره سطر سلول استفاده می‌کنید، در اینجا به صورت خودکار سطر جاری در محاسبات در نظر گرفته می‌شود. عبارت DAX زیر را در نظر بگیرید که بصورت یک ستون محاسباتی ساده در جدول Sales نوشته می‌شود:

زمینه سطر (Row Context) در DAX این فرمول Quantity را در جدول Sales در Net Price ضرب می‌کند. به طور دقیق‌تر، فرمول نوشته شده مراحل زیر را انجام می‌دهد:

  1. مقدار ستون Quantity را در سطر فعلی Sales به دست می‌آورد.
  2. مقدار ستون Net Price را در سطر فعلی Sales به دست می‌آورد.
  3. دو مقدار به دست آمده در مراحل قبل را ضرب می‌کند.

تا اینجای کار همه چیز ساده است. فرمول نویسی دکس زمانی دشوار می‌شود که شما بخواهید از شاخص در محاسبات خود استفاده کنید و همه چیز را به صورت ستون ببینید. مخصوصا برای افرادی که با اکسل کار کرده‌اند حذف کردن مفهوم شماره سطر در ذهن آنها نسبت به کسانی که با دیتابیس‌هایی مانند اکسس یا اسکیوال سرور یا mysql کار کرده‌اند، دشوارتر است. اصولاً عبارات DAX بر روی ستون‌ها عمل می‌کنند .به عنوان مثال، در یک شاخص با استفاده از کدنویسی DAX ممکن است عبارات زیر را بنویسید:

در این عبارت، Sales[Amount] و Sales[TotalCost] ارجاعات ستونی هستند. یک ارجاع ستونی شهودی به این معنی است که می‌خواهید مقدار یک ستون را بازیابی کنید. در مثال بالا، مقدار Sales[Amount] را برای سطری که در حال حاضر توسط SUMX پیمایش می‌شود، به دست می‌آورید. اگر با تابع SUMX و نحوه کار پیماشگرها آشنا نیستید، اصلا نگران نباشید، در ادامه با این مفاهیم بیشتر آشنا خواهید شد. علاوه بر این، می‌توانید از یک ارجاع ستونی برای دستور دادن به توابع خاص استفاده کنید، مانند شمارش تعداد نام‌های محصول:

در این حالت، Product[ProductName] مقدار ProductName را برای یک سطر خاص بازیابی نمی‌کند. در عوض، شما به یک ستون ارجاع می‌دهید تا تابع VALUES بداند که از کدام ستون استفاده کند. به عبارت دیگر، شما به ستون ارجاع می‌دهید، نه به مقدار آن. یک ارجاع ستونی یک تعریف تا حدودی مبهم است زیرا هم برای (1) ارجاع به مقدار یک ستون در یک سطر خاص (مانند ایجاد ستون محاسباتی) و هم برای (2) ارجاع به خود ستون کامل (در شاخص‌ها)، استفاده می‌شود. دلیل این روش افزایش خوانایی کدهای DAX است. هنگامی که از یک ارجاع ستونی برای بازیابی مقدار یک ستون در یک سطر معین استفاده می‌کنید، برای محاسبه مقدار، باید برای DAX مشخص کنید که از کدام سطر در جدول استفاده کند. مفهوم «سطر فعلی» زمینه سطر را تعریف می‌کند. درصورت عدم وجود زمینه سطر، ارزیابی یک ارجاع ستونی باعث بروز خطا می‌شود. بنابراین اگر فقط یک ارجاع ستونی را در یک مژر DAX بنویسید، یک خطا دریافت می‌کنید زیرا هیچ زمینه سطری وجود ندارد. به عنوان مثال، مژر زیر معتبر نیست. دلیل نامعتبر بودن شاخص زیر به این دلیل است که موتور Dax نمی تواند تشخیص دهد که بر روی این ستون چه کاری باید انجام دهد.

برای جلوگیری از بروز خطا، باید ستون را تجمیع کنید، نه اینکه به مقدار آن ارجاع دهید. در واقع، تعریف صحیح SalesAmount به شکل زیر است. در اینجا موتور Dax تشخیص می‌دهد که باید مقدارهای ستون [Amount] را جمع کند.

در کل، هر ارجاع ستونی برای ارزیابی به یک «سطر فعلی» نیاز دارد. با این حال، معنی «سطر فعلی» چیست؟ در این مقاله از «سطر فعلی» به عنوان یک روش کلی برای شناسایی مفهومی بسیار خاص در DAX استفاده شده است: زمینه سطر. زمینه سطر (Row Context) در DAX یک سطر واحد از یک جدول را مشخص می‌کند. به عنوان مثال، جدول Sales زیر را در نظر بگیرید. زمینه سطر (Row Context) در DAX ما می‌توانیم زمینه سطر (Row Context) در DAX را برای سطر دوم Sales با برجسته کردن آن سطر نشان دهیم. Row Context با این حال، می‌توانیم زمینه سطر را با استفاده از جدولی با تنها یک سطر - سطری که توسط زمینه سطر اشاره شده است - نیز نشان دهیم. زمینه سطر (Row Context) در DAX

چگونه یک زمینه سطر (Row Context) در DAX به ایجاد کنیم؟

شما هر زمان که یک جدول را پیمایش می‌کنید، چه به طور ضمنی (در یک ستون محاسباتی) و چه به طور صریح (با استفاده از یک پیمایش‌گر)، یک زمینه سطر دارید: • هنگامی که یک عبارت را در یک ستون محاسباتی می‌نویسید، عبارت برای هر سطر از جدول ارزیابی می‌شود و برای هر سطر یک زمینه سطر ایجاد می‌کند. • هنگامی که از یک پیمایش‌گر مانند FILTER, SUMX, AVERAGEX, ADDCOLUMNS یا هر یک از توابع DAX که روی یک عبارت جدول پیمایش می‌کنند استفاده می‌کنید.

ستون محاسباتی

یک ستون محاسباتی یک مورد خاص از یک پیمایش‌گر است. هنگامی که یک ستون محاسباتی ایجاد می‌کنید، DAX به طور ضمنی می‌داند که می‌خواهید یک محاسبه را سطر به سطر انجام دهید. بنابراین، عبارت Sales[Quantity] درواقع به این معنی است: "با نگاه کردن به داخل سطری که در آن مقدار ستون محاسباتی را محاسبه می‌کنیم، مقدار Sales[Quantity] را می‌خواهم". هنگامی که DAX می‌داند روی کدام سطر در یک جدول کار کند، به این معناست که یک زمینه سطر در آن جدول باز است. به عنوان مثال، اگر یک ستون محاسباتی در جدول Sales تعریف شده باشد، می‌گوییم که یک زمینه سطر در جدول Sales وجود دارد. در حقیقت هنگام انجام محاسبات با ستون‌های جدول Sales، می‌دانیم در مورد کدام سطر صحبت می‌کنیم. دقت کنید که زمینه سطر (Row Context) در DAX به طور پیش فرض در ستون‌های محاسباتی وجود دارد و موتور DAX برای هر سطر جدول، فرمول را اجرا می‌کند و نتیجه را در یک ستون جداگانه (ستون محاسباتی) ذخیره می‌کند. برخلاف پیمایش‌گرها که ردیف‌های قابل مشاهده را از طریق زمینه فیلتر پیمایش می‌کنند، ستون‌های محاسباتی در یک زمینه فیلتر خالی ارزیابی می‌شوند و بنابراین همیشه تمام ردیف‌های جدول را پیمایش می‌کنند.

توابع پیمایشگر

یک پیمایش‌گر (Iterator) همیشه یک عبارت جدول را سطر به سطر اسکن می‌کند و زمینه سطر (Row Context) همیشه دسترسی به کل سطر را فراهم می‌کند، حتی اگر عبارت جدول فقط به چند ستون اشاره کند: زمینه سطر (Row Context) در DAX موتور DAX ممکن است برای اجرای این کد، فقط بر ستون‌های ارجاع شده تمرکز کند، اما از دیدگاه مفهومی، پیمایش یک عبارت جدول در DAX به شما دسترسی به تمام ستون‌های آن جدول می‌دهد، حتی اگر فقط از چند ستون خاص استفاده شود. می‌توانیم مفهوم زمینه سطر را با یک مدل مفهومی نشان دهیم که شامل تمام ستون‌های جدول اصلی است، اما فقط یک سطر دارد. این مدل صرفاً برای توضیح چگونگی کارکرد DAX است.

یک زمینه فیلتر، فیلتر می کند، یک زمینه سطر (Row Context) در DAX، پیمایش می کند

هنگامی که یک عبارت DAX را اجرا می کنید، معمولاً هر دو زمینه فیلتر و سطر درگیر هستند. در مطلب زمینه فیلتر می‌توانید با این مفهوم اساسی فرمول نویسی DAX بیشتر آشنا شوید. به عنوان مثال، تعریف زیر از مژر Sales Amount را در نظر بگیرید:

تابع SUMX یک پیمایش‌گر DAX است که فرمول نوشته شده در آرگومان دوم را برای هر سطر از عبارت جدول معرفی شده در آرگومان اول سطر به سطر اجرا می کند. در واقع تابع SUMX عبارت جدول مشخص شده در آرگومان اول را پیمایش می کند و زمینه فیلتر آن عبارت جدول را فیلتر می کند. ساده ترین عبارت جدولی که می توانیم استفاده کنیم فقط ارجاع به جدول Sales است. یک ارجاع جدول در DAX همیشه توسط زمینه فیلتر، فیلتر می شود، بنابراین SUMX ردیف های Sales را که در زمینه فیلتر قابل مشاهده هستند سطر به سطر پیمایش می کند. به عنوان مثال، نمودار زیر این رفتار را هنگامی که فیلتری را در 12 ژوئن 2024 اعمال می کنیم نشان می دهد. زمینه سطر (Row Context) در DAX نام Sales برای شناسایی دو مفهوم مختلف استفاده می شود: • در سمت چپ تصویر بالا، جدول Sales را در مدل معنایی مشاهده می‌کنید (در نمای Table View در Power BI). وقتی در مورد «جدول مدل» صحبت می کنیم، جدول فیزیکی را در مدل معنایی با تمام سطرها در نظر می گیریم و هر فیلتری را نادیده می گیریم. • در سمت راست، ارجاع جدول Sales را مشاهده می‌کنید. یک ارجاع جدول در DAX همیشه توسط فیلترهای امنیتی و همچنین توسط زمینه فیلتر، فیلتر می شود. ارجاع جدول مانند یک view در جدول مدل است که فقط ردیف های "قابل مشاهده" را برمی گرداند. DAX نمی تواند فیلترهای امنیتی را نادیده بگیرد، در حالی که زمینه فیلتر را می توان با افزودن و حذف فیلترها با استفاده از CALCULATE و CALCULATETABLE دستکاری کرد. در مطالب جداگانه به صورت مفصل راجع به مفاهیم فیلترهای امنیتی و تغییر زمینه فیلتر توضیح داده خواهد شد. عبارت SUMXاین عملیات را انجام می دهد:

  1. تعیین جدول: آرگومان اول را در زمینه فیلتر ارزیابی می‌کند تا عبارت جدول فیلتر شده را مشخص کند.
  2. محاسبه برای هر سطر: آرگومان دوم را برای هر سطر در جدول به دست آمده، در زمینه سطر (Row Context) در DAX مربوطه ارزیابی می‌کند. این فرایند در جدول سطر به سطر تکرار می‌شود و نتایج برای محاسبه نهایی جمع می‌شوند.

اگر فقط از ارجاعات ستونی در آرگومان دوم استفاده کنیم، زمینه فیلتر دیگر تأثیر چندانی ندارد. با این حال، اگر آرگومان دوم شامل عبارات پیچیده‌تر باشد (مانند محاسبات یا مقادیر وابسته به زمینه)، زمینه فیلتر می‌تواند اهمیت پیدا کند. به عنوان مثال، مژر زیر مقدار هر تراکنش را بر عددی تقسیم می کند که این عدد از طریق یک اسلایسر فیلتر شده تعیین می‌شود. مثلا میخواهید اعداد شما بر 1000 یا 1 میلیون یا 1 میلیارد تقسیم شود. بنابراین زمینه فیلتر نقش مهمی خواهد داشت. یعنی می‌خواهید عبارت محاسبه از ضرب Quantity در Net Price در هر سطر ابتدا بر واحد انتخاب شده تقسیم شود، سپس جمع انجام شود.

تابع SELECTEDVALUEانتخاب فعلی یک اسلایسر را در جدول Scale برمی گرداند زیرا زمینه فیلتر هنوز در آن عبارت فعال است. کد نشان داده شده ایده آل نیست زیرا اگر عبارت به زمینه سطر بستگی نداشته باشد، می تواند قبل از پیمایش‌گر ارزیابی شود، و این وابستگی را به طور صریح نشان دهد:

در این مثال، حالت ایده آل این است که ابتدای نتیجه جمع حاصل ضرب Quantity و Net Price محاسبه شود، سپس حاصل جمع محاسبه شده بر واحد مورد نظر تقسیم شود به عبارت دیگر عملگر تقسیم باید خارج از SUMX قرار بگیرد. با این حال درنظر داشته باشید که تنها هدف این مثال نشان دادن این موضوع بود که زمینه فیلتر در عبارتی که در یک زمینه سطر در پیمایش‌گر ارزیابی می‌شود، در دسترس است. تاکید می‌شود که این مثال‌ها به قصد آموزشی ارائه شده‌اند و هدف اصلی این مقاله بهینه‌سازی کد DAX نیست.

عبارت جدول، کاردینالیتی را تعریف می کند

زمینه سطر تمام ردیف های بازگردانده شده توسط عبارت جدول ارائه شده به تابع پیمایش‌گر را سطر به سطر پیمایش می کند. بنابراین، کاردینالیتی یک پیمایش توسط عبارت جدول تعریف می‌شود. به عنوان مثال، دو مژر زیر را در نظر بگیرید:

مژر Sales Amount Projection همان نتیجه Sales Amount را برمی گرداند زیرا تعداد ردیف های پیمایش شده (کاردینالیتی) با جدول Sales یکسان است. در واقع، حتی اگر متغیر SalesProjection فقط دو ستون داشته باشد، تعداد ردیف ها یکسان است. از دیدگاه عملکردی، تا زمانی که جدول به صورت فیزیکی در حافظه بارگذاری نشود، هزینه تخصیص حافظه برای ستون‌های مدل استفاده نشده پرداخت نمی‌شود. با این حال، برای اهداف این مقاله، می توانیم آن را نادیده بگیریم: آنچه مهم است این است که نتیجه SUMX به تعداد ردیف های پیمایش شده بستگی دارد و این تعداد یکسان است. تابع SELECTCOLUMNS کاردینالیتی جدول پیمایش شده را تغییر نمی دهد. در مقابل، مژر Sales Amount Grouped نتیجه متفاوتی را برمی‌گرداند، زیرا تعداد ترکیب‌های منحصر به فرد از Quantity و Net Price در جدول Sales را برمی‌گرداند (توسط SUMMARIZEبرگردانده می‌شود) اگر با تابع SUMMARIZEآشنا نیستید، این تابع مانند دستور group by در SQL یا ابزار Group by در پاور کوئری کار می‌کند، یعنی ستون های یک جدول را بر اساس یک یا چند ستون تجمعی می‌کند. در واقع، SUMMARIZEمی‌تواند تعداد کمتری ردیف از جدول ارائه شده در آرگومان اول را برگرداند، که معمولاً منجر به کاردینالیتی کوچکتر در نتیجه می‌شود. این کاردینالیتی کوچکتر، دلیل تفاوت در نتیجه است.

خلاصه و جمع‌بندی زمینه سطر در DAX

در این مقاله، مفهوم کلیدی زمینه سطر (Row Context) در DAX مورد بررسی قرار گرفت. زمینه سطر تعیین می‌کند که هنگام ارجاع به ستون‌ها، DAX از کدام سطر استفاده کند و برای نوشتن عبارات DAX صحیح و مؤثر ضروری است. ایجاد زمینه سطر می‌تواند به صورت صریح با استفاده از توابع پیمایش‌گر یا به صورت ضمنی در ستون‌های محاسباتی انجام شود. همچنین، تعامل بین زمینه‌های سطر و فیلتر مورد بحث قرار گرفت و نشان داده شد که چگونه این دو زمینه با هم کار می‌کنند تا نتایج محاسبات DAX را شکل دهند. در نهایت، نشان داده شد که نتیجه توابعی مانند SUMX به تعداد سطرهای پیمایش شده (کاردینالیتی) بستگی دارد که توسط عبارت جدول تعیین می‌شود. درک این مفاهیم برای تسلط بر DAX و اجتناب از خطاهای رایج حیاتی است. منبع: [Row Context in DAX Explained Visually - SQLBI]

این محتوا چطور بود؟

نظر شما به بهبود محتوا کمک می‌کند

امیر دایی
امیر دایی
500k دنبال‌کننده

از بچگی عاشق برنامه نویسی بودم