تابع EARLIER در Power BI
تابع EARLIER در زبان DAX یکی از توابع خاص و قدرتمند در Power BI است که برای ارجاع به مقدار قبلی یک ستون در سطح ردیف قبلی از محاسبه استفاده میشود. این تابع معمولاً در ستونهای محاسبهشده (Calculated Columns) کاربرد دارد و به شما اجازه میدهد تا در محاسباتی که شامل چند سطح زمینه (Row Context) هستند، به مقدار قبلی بازگردید.
سینتکس تابع EARLIER
EARLIER(<column>, <level>)
- column: ستونی که میخواهید مقدار قبلی آن را بازیابی کنید.
- level (اختیاری): سطح زمینهای که میخواهید به آن ارجاع دهید (پیشفرض 1).
عملکرد چگونه است؟
تابع EARLIER زمانی مفید است که در یک محاسبه، دو زمینه ردیفی (Row Context) همزمان فعال باشند — مثلاً وقتی از توابعی مانند FILTER, CALCULATE, یا SUMX در داخل ستون محاسبهشده استفاده میکنید. در این حالت، EARLIER به شما اجازه میدهد تا به مقدار ردیف بیرونیتر (قبلیتر) دسترسی داشته باشید.
✅ مثال ساده
فرض کنید جدول Sales دارید و میخواهید برای هر ردیف، تعداد سفارشهایی را بشمارید که مبلغشان کمتر از مبلغ همان ردیف باشد:
OrdersBelowCurrent =
CALCULATE(
COUNTROWS(Sales),
FILTER(
Sales,
Sales[Amount] < EARLIER(Sales[Amount])
)
)
در این مثال، EARLIER(Sales[Amount]) به مقدار ستون Amount در ردیف فعلی (در زمینه بیرونیتر) اشاره میکند، در حالی که Sales[Amount] در داخل FILTER به ردیفهای دیگر اشاره دارد.
مثالی دیگر
برای نشان دادن کاربرد EARLIER، لازم است سناریویی ایجاد شود که مقدار رتبه را محاسبه کرده و سپس از آن مقدار رتبه در محاسبات دیگر استفاده کند.
مثال زیر بر اساس این جدول ساده، ProductSubcategory، است که کل فروش برای هر ProductSubcategory را نشان میدهد.
جدول نهایی، شامل ستون رتبهبندی، در اینجا نشان داده شده است.
| ProductSubcategoryKey | EnglishProductSubcategoryName | TotalSubcategorySales | SubcategoryRanking |
|---|---|---|---|
| 18 | Bib-Shorts | $156,167.88 | 18 |
| 26 | Bike Racks | $220,720.70 | 14 |
| 27 | Bike Stands | $35,628.69 | 30 |
| 28 | Bottles and Cages | $59,342.43 | 24 |
| 5 | Bottom Brackets | $48,643.47 | 27 |
| 6 | Brakes | $62,113.16 | 23 |
| 19 | Caps | $47,934.54 | 28 |
| 7 | Chains | $8,847.08 | 35 |
| 29 | Cleaners | $16,882.62 | 32 |
| 8 | Cranksets | $191,522.09 | 15 |
| 9 | Derailleurs | $64,965.33 | 22 |
| 30 | Fenders | $41,974.10 | 29 |
| 10 | Forks | $74,727.66 | 21 |
| 20 | Gloves | $228,353.58 | 12 |
| 4 | Handlebars | $163,257.06 | 17 |
| 11 | Headsets | $57,659.99 | 25 |
| 31 | Helmets | $451,192.31 | 9 |
| 32 | Hydration Packs | $96,893.78 | 20 |
| 21 | Jerseys | $699,429.78 | 7 |
| 33 | Lights | 36 | |
| 34 | Locks | $15,059.47 | 33 |
| 1 | Mountain Bikes | $34,305,864.29 | 2 |
| 12 | Mountain Frames | $4,511,170.68 | 4 |
| 35 | Panniers | 36 | |
| 13 | Pedals | $140,422.20 | 19 |
| 36 | Pumps | $12,695.18 | 34 |
| 2 | Road Bikes | $40,551,696.34 | 1 |
| 14 | Road Frames | $3,636,398.71 | 5 |
| 15 | Saddles | $52,526.47 | 26 |
| 22 | Shorts | $385,707.80 | 10 |
| 23 | Socks | $28,337.85 | 31 |
| 24 | Tights | $189,179.37 | 16 |
| 37 | Tires and Tubes | $224,832.81 | 13 |
| 3 | Touring Bikes | $13,334,864.18 | 3 |
| 16 | Touring Frames | $1,545,344.02 | 6 |
| 25 | Vests | $240,990.04 | 11 |
| 17 | Wheels | $648,240.04 | 8 |
ایجاد مقدار رتبه (Rank Value)
یک راه برای بدست آوردن مقدار رتبه برای یک مقدار معین در یک ردیف، شمارش تعداد ردیفهایی در همان جدول است که مقداری بزرگتر (یا کوچکتر) از مقداری که مقایسه میشود دارند. این تکنیک برای بالاترین مقدار در جدول، یک مقدار خالی یا صفر برمیگرداند، در حالی که مقادیر مساوی، مقدار رتبه یکسانی خواهند داشت و مقدار بعدی (بعد از مقادیر مساوی) یک مقدار رتبه غیر متوالی خواهد داشت. به نمونه زیر مراجعه کنید.
یک ستون محاسبه شده جدید، SubCategorySalesRanking، با استفاده از فرمول زیر ایجاد میشود.
= COUNTROWS(FILTER(ProductSubcategory, EARLIER(ProductSubcategory[TotalSubcategorySales])<ProductSubcategory[TotalSubcategorySales]))+1
EARLIER
مراحل زیر روش محاسبه را با جزئیات بیشتری شرح میدهد.
- تابع EARLIER مقدار TotalSubcategorySales را برای ردیف فعلی جدول دریافت میکند. در این حالت، چون فرآیند در حال شروع است، اولین ردیف در جدول است.
- EARLIER([TotalSubcategorySales]) برابر با $156,167.88، ردیف فعلی در حلقه بیرونی، ارزیابی میشود.
- تابع FILTER اکنون جدولی را برمیگرداند که در آن همه ردیفها مقدار TotalSubcategorySales بزرگتر از $156,167.88 دارند (که مقدار فعلی EARLIER است).
- تابع COUNTROWS ردیفهای جدول فیلتر شده را میشمارد و آن مقدار را به ستون محاسبه شده جدید در ردیف فعلی به علاوه ۱ اختصاص میدهد. برای جلوگیری از خالی شدن بالاترین مقدار رتبهبندی شده، اضافه کردن ۱ لازم است.
- فرمول ستون محاسبه شده به ردیف بعدی منتقل میشود و مراحل ۱ تا ۴ را تکرار میکند. این مراحل تا رسیدن به انتهای جدول تکرار میشوند.
تابع EARLIER همیشه مقدار ستون را قبل از عملیات فعلی جدول دریافت میکند. اگر نیاز دارید مقداری را قبل از آن از حلقه دریافت کنید، آرگومان دوم را روی ۲ تنظیم کنید.
کاربردهای رایج
- مقایسه ردیف فعلی با سایر ردیفها در ستونهای محاسبهشده
- ساخت رتبهبندیها، شمارشهای تجمعی، یا تحلیلهای مقایسهای
- استفاده در توابعی که زمینه ردیفی تو در تو ایجاد میکنند
⚠️ نکات مهم
EARLIERفقط در ستونهای محاسبهشده قابل استفاده است، نه در معیارها (Measures).- اگر فقط یک زمینه ردیفی فعال باشد، استفاده از
EARLIERباعث خطا میشود. - در مدلهای پیچیده، استفاده زیاد از
EARLIERممکن است باعث کاهش عملکرد شود؛ در این موارد بهتر است از تابع جدیدترVARاستفاده کنید.
جایگزین مدرن: استفاده از متغیرها (VAR)
تابع EARLIER در بسیاری از موارد با استفاده از متغیرها قابل جایگزینی است که خوانایی و عملکرد بهتری دارند:
VAR CurrentAmount = Sales[Amount]
RETURN
CALCULATE(
COUNTROWS(Sales),
FILTER(Sales, Sales[Amount] < CurrentAmount)
)
ملاحظات
- اگر قبل از شروع اسکن جدول، یک زمینه ردیف وجود داشته باشد، EARLIER موفق میشود. در غیر این صورت، خطا برمیگرداند.
- عملکرد EARLIER ممکن است کند باشد زیرا از لحاظ تئوری، ممکن است مجبور باشد تعدادی عملیات انجام دهد که نزدیک به تعداد کل ردیفها (در ستون) ضربدر همان تعداد (بسته به نحو عبارت) باشد. به عنوان مثال، اگر 10 ردیف در ستون داشته باشید، تقریباً 100 عملیات ممکن است مورد نیاز باشد. اگر 100 ردیف داشته باشید، ممکن است نزدیک به 10000 عملیات انجام شود.
- این تابع برای استفاده در حالت DirectQuery هنگام استفاده در ستونهای محاسبه شده یا قوانین امنیتی سطح ردیف (RLS) پشتیبانی نمیشود.
برای خرید لایسنس نرم افزار Power BI ، میتوانید از خدمات ما استفاده نموده و درخواست خود را از طریق فرم زیر ثبت نمایید.
میتوانید پاور بی آی دسکتاپ رایگان را دانلود کنید : Power BI desktop download
