تابع WINDOW در Power BI
تابع WINDOW در Power BI (زبان DAX) برای انجام محاسبات روی مجموعهای از ردیفها در یک بازه مشخص استفاده میشود، مشابه window functions در SQL. این تابع امکان محاسبه میانگین متحرک، مقایسه با ردیف قبلی، جمع تجمعی و موارد مشابه را فراهم میکند.
تعریف و نحوه استفاده
WINDOW ( from[, from_type], to[, to_type][, <relation> or <axis>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>][, <reset>] )
fromوto: محدوده شروع و پایان پنجره (window) را مشخص میکنند.from_typeوto_type: نوع موقعیتدهی را تعیین میکنند:REL: موقعیت نسبی نسبت به ردیف فعلی (مثلاً -1 یعنی ردیف قبلی)ABS: موقعیت مطلق از ابتدای پارتیشن (مثلاً 1 یعنی اولین ردیف)
orderBy: ترتیب مرتبسازی دادهها در پنجره.partitionBy: تقسیم دادهها به گروههای مستقل برای اعمال پنجره.blanks: نحوه برخورد با مقادیر خالی.reset: بازنشانی پنجره در صورت تغییر مقدار خاصی.
✅ مثال 1: محاسبه میانگین متحرک 3 ماهه
MovingAverage3Months =
AVERAGEX(
WINDOW(-2, REL, 0, REL, ALLSELECTED('Date'[Month]), ORDERBY('Date'[Month])),
[Sales]
)
در این مثال:
WINDOW(-2, REL, 0, REL, ...)یک پنجره ۳ ماهه شامل ماه جاری و دو ماه قبل ایجاد میکند.AVERAGEXمیانگین فروش در این بازه را محاسبه میکند.
✅ مثال 2: measure
اقدام زیر:
3-day Average Price =
AVERAGEX(
WINDOW(
-2,REL,0,REL,
SUMMARIZE(ALLSELECTED('Sales'), 'Date'[Date], 'Product'[Product]),
ORDERBY('Date'[Date]),
KEEP,
PARTITIONBY('Product'[Product])
),
CALCULATE(AVERAGE(Sales[Unit Price]))
)
میانگین قیمت واحد هر محصول را در سه روز گذشته برمیگرداند. توجه داشته باشید که بازه زمانی سه روزه شامل سه روزی است که محصول در آن فروش داشته است، نه لزوماً سه روز تقویمی متوالی.
✅ مثال 3: measure
اقدام زیر:
RunningSum =
SUMX (
WINDOW (
1, ABS, 0, REL,
ALLSELECTED (
'Date'[Fiscal Year],
'Date'[Month Number Of Year]
),
PARTITIONBY ( 'Date'[Fiscal Year] )
),
[Total Sales]
)
مجموع فروش کل را بر اساس ماه، تعداد سال، برمیگرداند و برای هر سال مالی دوباره شروع به کار میکند:
| Year | Month Number Of Year | Sales Amount | RunningSum |
|---|---|---|---|
| FY2018 | 1 | $1,327,675 | $1,327,675 |
| FY2018 | 2 | $3,936,463 | $5,264,138 |
| FY2018 | 3 | $700,873 | $5,965,011 |
| FY2018 | 4 | $1,519,275 | $7,484,286 |
| FY2018 | 5 | $2,960,378 | $10,444,664 |
| FY2018 | 6 | $1,487,671 | $11,932,336 |
| FY2018 | 7 | $1,423,357 | $13,355,693 |
| FY2018 | 8 | $2,057,902 | $15,413,595 |
| FY2018 | 9 | $2,523,948 | $17,937,543 |
| FY2018 | 10 | $561,681 | $18,499,224 |
| FY2018 | 11 | $4,764,920 | $23,264,145 |
| FY2018 | 12 | $596,747 | $23,860,891 |
| FY2019 | 1 | $1,847,692 | $1,847,692 |
| FY2019 | 2 | $2,829,362 | $4,677,054 |
| FY2019 | 3 | $2,092,434 | $6,769,488 |
| FY2019 | 4 | $2,405,971 | $9,175,459 |
| FY2019 | 5 | $3,459,444 | $12,634,903 |
| FY2019 | 6 | $2,850,649 | $15,485,552 |
| FY2019 | 7 | $2,939,691 | $18,425,243 |
| FY2019 | 8 | $3,964,801 | $22,390,045 |
| FY2019 | 9 | $3,287,606 | $25,677,650 |
| FY2019 | 10 | $2,157,287 | $27,834,938 |
| FY2019 | 11 | $3,611,092 | $31,446,030 |
| FY2019 | 12 | $2,624,078 | $34,070,109 |
| FY2020 | 1 | $3,235,187 | $3,235,187 |
| FY2020 | 2 | $4,070,046 | $7,305,233 |
| FY2020 | 3 | $4,429,833 | $11,735,066 |
| FY2020 | 4 | $4,002,614 | $15,737,680 |
| FY2020 | 5 | $5,265,797 | $21,003,477 |
| FY2020 | 6 | $3,465,241 | $24,468,717 |
| FY2020 | 7 | $3,513,064 | $27,981,781 |
| FY2020 | 8 | $5,247,165 | $33,228,947 |
| FY2020 | 9 | $5,104,088 | $38,333,035 |
| FY2020 | 10 | $3,542,150 | $41,875,184 |
| FY2020 | 11 | $5,151,897 | $47,027,081 |
| FY2020 | 12 |
✅ مثال 4: محاسبه بصری
کوئری DAX محاسبه بصری زیر:
TotalSalesRunningSumByYear = SUMX(WINDOW(0, ABS, 0, REL, ROWS, HIGHESTPARENT), [SalesAmount])
کل فروش تجمعی را بر اساس ماه، که در طول هر سال محاسبه شده است، برمیگرداند. میتوان به جای HIGHESTPARENT از مقدار ۱ استفاده کرد، با همان نتیجه.
تصویر زیر ماتریس بصری و عبارت محاسبه بصری را نشان میدهد:
✅ مثال 5:محاسبه بصری
کوئری DAX محاسبه بصری زیر:
TotalSalesRunningSumByQuarter = SUMX(WINDOW(0, ABS, 0, REL, , -1), [SalesAmount])
LOWESTPARENT استفاده کرد، با همان نتیجه.
کاربردهای رایج
- مقایسه با ردیف قبلی یا بعدی (مثلاً فروش این ماه نسبت به ماه قبل)
- محاسبه میانگین متحرک یا مجموع تجمعی
- تحلیل روندها در دادههای زمانی
- ایجاد شاخصهای رتبهبندی یا فاصلهای
⚠️ نکات مهم
- تابع
WINDOWفقط در visual calculations، measures، calculated columns و calculated tables قابل استفاده است. - برای استفاده مؤثر، باید دادهها را بهدرستی مرتبسازی (orderBy) و پارتیشنبندی (partitionBy) کنید.
- این تابع از دسامبر 2022 به DAX اضافه شده و در نسخههای جدید Power BI در دسترس است.
ملاحظات
به جز ستونهایی که توسط توابع جدول DAX اضافه میشوند، هر ستون مرتبط، وقتی matchBy وجود ندارد، یا هر ستون در matchBy و partitionBy، وقتی matchBy وجود دارد، باید یک مقدار بیرونی متناظر داشته باشد تا به تعریف ردیف فعلی که روی آن عمل میکند، کمک کند. و اگر from_type و to_type هر دو مقدار ABS داشته باشند، موارد زیر فقط برای ستونهای partitionBy اعمال میشود:
- اگر دقیقاً یک ستون بیرونی متناظر وجود داشته باشد، از مقدار آن استفاده میشود.
- اگر هیچ ستون بیرونی متناظری وجود نداشته باشد:
- WINDOW ابتدا تمام ستونهایی را که ستون بیرونی متناظری ندارند، تعیین میکند.
- برای هر ترکیبی از مقادیر موجود برای این ستونها در زمینه والد WINDOW، WINDOW ارزیابی میشود و ردیفهای متناظر بازگردانده میشوند.
- خروجی نهایی WINDOW ترکیبی از این ردیفها است.
- اگر بیش از یک ستون بیرونی متناظر وجود داشته باشد، یک خطا بازگردانده میشود.
اگر تمام ستونهای رابطه توسط توابع جدول DAX اضافه شده باشند، خطایی برگردانده میشود.
اگر matchBy وجود داشته باشد، WINDOW سعی میکند از ستونهای matchBy و partitionBy برای شناسایی ردیف استفاده کند. و اگر matchBy وجود نداشته باشد و ستونهای مشخص شده در orderBy و partitionBy نتوانند به طور منحصر به فرد هر ردیف در رابطه را شناسایی کنند، آنگاه:
WINDOW function
- پنجره سعی میکند کمترین تعداد ستون اضافی مورد نیاز برای شناسایی منحصر به فرد هر سطر را پیدا کند.
- اگر چنین ستونهایی پیدا شوند، پنجره به طور خودکار این ستونهای جدید را به orderBy اضافه میکند و هر پارتیشن با استفاده از این مجموعه جدید از ستونهای orderBy مرتب میشود.
- اگر چنین ستونهایی پیدا نشوند، خطایی برگردانده میشود.
یک جدول خالی برگردانده میشود اگر:
- مقدار بیرونی متناظر ستون orderBy یا partitionBy در رابطه وجود نداشته باشد.
- کل پنجره خارج از پارتیشن باشد، یا ابتدای پنجره بعد از انتهای آن باشد.
اگر WINDOW در یک ستون محاسبهشده که در همان جدول به عنوان رابطه تعریف شده است، استفاده شود و orderBy حذف شود، خطایی بازگردانده میشود.
اگر شروع پنجره قبل از ردیف اول باشد، روی ردیف اول تنظیم میشود. به طور مشابه، اگر انتهای پنجره بعد از آخرین ردیف پارتیشن باشد، روی آخرین ردیف تنظیم میشود.
reset فقط در محاسبات بصری قابل استفاده است و نمیتوان آن را در ترکیب با orderBy یا partitionBy استفاده کرد. اگر reset وجود داشته باشد، میتوان axis را مشخص کرد اما relation را نمیتوان.
اگر مقدار reset مطلق باشد (یعنی یک عدد صحیح مثبت، HIGHESTPARENT یا یک مرجع فیلد) و محاسبه در سطح هدف یا بالاتر از سطح هدف در سلسله مراتب ارزیابی شود، محاسبه برای هر عنصر جداگانه تنظیم مجدد میشود. یعنی، تابع در یک پارتیشن که فقط شامل آن عنصر خاص است، ارزیابی میشود.
برای خرید لایسنس نرم افزار Power BI ، میتوانید از خدمات ما استفاده نموده و درخواست خود را از طریق فرم زیر ثبت نمایید.
میتوانید پاور بی آی دسکتاپ رایگان را دانلود کنید : Power BI desktop download

