راهنمای جامع توابع تحلیلی و پنجرهای SQL Server
مقدمه و هدف راهنما
توابع تحلیلی یا Window Functions در SQL Server راهی مجموعهمحور برای پاسخ به سؤالهایی هستند که به ردیف جاری و جایگاه آن میان ردیفهای مرتبط وابستهاند. مقایسه فروش با ماه قبل، یافتن موعد بعدی، سنجش رشد از اولین مقدار، مشاهده مقصد نهایی، رتبه درصدی و محاسبه میانه همگی بدون حذف جزئیات ردیف قابل انجاماند.
این مجموعه هشت تابع LAG، LEAD، FIRST_VALUE، LAST_VALUE، CUME_DIST، PERCENT_RANK، PERCENTILE_CONT و PERCENTILE_DISC را پوشش میدهد. هدف فقط معرفی Syntax نیست؛ ترتیب منطقی، پارتیشن، Frame، NULL، tie، نسخه سازگار و هزینه اجرای واقعی نیز بررسی میشوند تا Query برای محیط تولید قابل اتکا باشد.
در یک Query پنجرهای، موتور ممکن است Sort، Segment، Sequence Project، Window Aggregate یا Window Spool بسازد. طراحی خوب از تعریف صحیح مسئله شروع میشود و سپس با ایندکس، کاهش عرض ردیف و کنترل Memory Grant تکمیل میگردد. کوتاه بودن کد بهتنهایی نشانه سریع بودن یا درست بودن آن نیست.
دسترسی سریع به مقالههای تخصصی
مدل ذهنی OVER، PARTITION BY و ORDER BY
عبارت OVER محدوده محاسبه تابع را معرفی میکند. PARTITION BY ردیفها را به گروههای منطقی مانند مشتری، دستگاه، حساب یا دپارتمان تقسیم میکند؛ در نبود آن همه ورودی یک پارتیشن است. این تقسیمبندی ردیفها را ادغام نمیکند و صرفاً مرز مشاهده تابع را تعیین مینماید.
ORDER BY داخل OVER با ORDER BY نهایی Query دو مسئولیت متفاوت دارد. اولی توالی محاسبه را تعریف میکند و دومی فقط ترتیب نمایش خروجی را. اگر چند ردیف مقدار ترتیب برابر دارند، افزودن کلیدی مانند EventId یا SaleId برای شکستن tie باعث میشود نتیجه میان اجراها و طرحهای متفاوت پایدار بماند.
Frame بخش دقیقتری از پنجره است و معمولاً با ROWS BETWEEN نوشته میشود. در LAST_VALUE، Frame پیشفرض ممکن است در ردیف جاری پایان یابد و بهجای آخرین مقدار کل گروه، همان مقدار جاری را برگرداند. نوشتن UNBOUNDED FOLLOWING در این سناریو یک جزئیات تزئینی نیست، بلکه تعریف معنای خروجی است.
ترتیب منطقی پردازش SQL نیز مهم است. تابع پنجرهای پس از WHERE محاسبه میشود و در WHERE همان سطح قابل استفاده نیست. برای فیلتر کردن خروجی تابع باید از CTE یا Derived Table استفاده کرد. جای فیلتر تعیین میکند کدام ردیفها عضو جمعیت پنجره باشند و بنابراین میتواند پاسخ را تغییر دهد.
دستهبندی توابع این مجموعه
توابع Offset یعنی LAG و LEAD رابطه ردیف جاری با همسایه پیشین یا بعدی را بیان میکنند. توابع Value یعنی FIRST_VALUE و LAST_VALUE یک مقدار مرزی را طبق ترتیب و Frame برمیگردانند. CUME_DIST و PERCENT_RANK جایگاه نسبی را میسنجند و دو تابع Percentile آستانهای از توزیع داده استخراج میکنند.
| تابع | کاربرد اصلی | نوع خروجی یا نکته مهم | لینک آموزش کامل |
|---|
| LAG | خواندن مقدار یک ردیف پیشین بدون Self Join و محاسبه تغییرات دورهای | همنوع با scalar_expression و در صورت امکان Nullable | آموزش LAG |
| LEAD | خواندن مقدار ردیف آینده برای موعد بعدی، فاصله زمانی و تشخیص انتهای زنجیره | همنوع با scalar_expression و در صورت امکان Nullable | آموزش LEAD |
| FIRST_VALUE | مقایسه هر ردیف با نخستین مقدار یک گروه، دوره یا بازه تحلیلی | همنوع با scalar_expression | آموزش FIRST_VALUE |
| LAST_VALUE | یافتن آخرین مقدار یک پارتیشن و مقایسه وضعیت جاری با مقصد نهایی | همنوع با scalar_expression | آموزش LAST_VALUE |
| CUME_DIST | محاسبه جایگاه تجمعی هر مقدار در توزیع و شناسایی صدک تقریبی | float بزرگتر از صفر و کوچکتر یا مساوی یک | آموزش CUME_DIST |
| PERCENT_RANK | تبدیل رتبه نسبی به عددی بین صفر و یک برای مقایسه افراد یا اقلام | float بین صفر و یک؛ ردیف اول صفر است | آموزش PERCENT_RANK |
| PERCENTILE_CONT | محاسبه میانه و صدکهای عددی با درونیابی میان مقادیر مجاور | float(53)؛ ممکن است مقداری خارج از دادههای واقعی با درونیابی بسازد | آموزش PERCENTILE_CONT |
| PERCENTILE_DISC | انتخاب مقدار واقعی موجود در مجموعه برای میانه، SLA و آستانههای قابل گزارش | همنوع عبارت مرتبسازی و همیشه یکی از مقادیر موجود | آموزش PERCENTILE_DISC |
تابع LAG در SQL Server
LAG برای خواندن مقدار یک ردیف پیشین بدون Self Join و محاسبه تغییرات دورهای استفاده میشود. LEAD به ردیف بعدی نگاه میکند، اما LAG گذشته هر ردیف را میخواند. در طراحی باید ترتیب قطعی، مرز پارتیشن و نوع داده خروجی با نمونههای مرزی آزمون شوند.
از نظر سازگاری: SQL Server 2012؛ گزینه IGNORE NULLS از SQL Server 2022. نکته کارایی اصلی آن چنین است: ایندکسی با کلیدهای PARTITION BY و ORDER BY میتواند Sort پرهزینه را کاهش دهد.
مطالعه آموزش کامل LAG با ۱۰ مثال اجرایی و نکات Performance
تابع LEAD در SQL Server
LEAD برای خواندن مقدار ردیف آینده برای موعد بعدی، فاصله زمانی و تشخیص انتهای زنجیره استفاده میشود. LAG گذشته را میبیند، اما LEAD بدون جابهجایی فیزیکی ردیف، مقدار آینده را بازمیگرداند. در طراحی باید ترتیب قطعی، مرز پارتیشن و نوع داده خروجی با نمونههای مرزی آزمون شوند.
از نظر سازگاری: SQL Server 2012؛ گزینه IGNORE NULLS از SQL Server 2022. نکته کارایی اصلی آن چنین است: مرتبسازی پوششدادهشده و محدود کردن ستونهای ورودی، مصرف حافظه Window Operator را کم میکند.
مطالعه آموزش کامل LEAD با ۱۰ مثال اجرایی و نکات Performance
تابع FIRST_VALUE در SQL Server
FIRST_VALUE برای مقایسه هر ردیف با نخستین مقدار یک گروه، دوره یا بازه تحلیلی استفاده میشود. MIN کوچکترین مقدار را میدهد؛ FIRST_VALUE مقدار اولین ردیف طبق ORDER BY را میدهد. در طراحی باید ترتیب قطعی، مرز پارتیشن و نوع داده خروجی با نمونههای مرزی آزمون شوند.
از نظر سازگاری: SQL Server 2012؛ گزینه IGNORE NULLS از SQL Server 2022. نکته کارایی اصلی آن چنین است: Window Spool و Sort را در Actual Execution Plan بررسی کنید و ترتیب ایندکس را با پنجره هماهنگ سازید.
مطالعه آموزش کامل FIRST_VALUE با ۱۰ مثال اجرایی و نکات Performance
تابع LAST_VALUE در SQL Server
LAST_VALUE برای یافتن آخرین مقدار یک پارتیشن و مقایسه وضعیت جاری با مقصد نهایی استفاده میشود. FIRST_VALUE از ابتدای پنجره میخواند؛ LAST_VALUE به انتهای Frame تعریفشده وابسته است. در طراحی باید ترتیب قطعی، مرز پارتیشن و نوع داده خروجی با نمونههای مرزی آزمون شوند.
از نظر سازگاری: SQL Server 2012؛ گزینه IGNORE NULLS از SQL Server 2022. نکته کارایی اصلی آن چنین است: Frame وسیع ممکن است حافظه بیشتری بخواهد؛ ورودی را زود فیلتر و ترتیب مناسب را ایندکس کنید.
مطالعه آموزش کامل LAST_VALUE با ۱۰ مثال اجرایی و نکات Performance
تابع CUME_DIST در SQL Server
CUME_DIST برای محاسبه جایگاه تجمعی هر مقدار در توزیع و شناسایی صدک تقریبی استفاده میشود. PERCENT_RANK از رتبه شروع میکند؛ CUME_DIST تمام ردیفهای همرتبه را در صورت کسر میآورد. در طراحی باید ترتیب قطعی، مرز پارتیشن و نوع داده خروجی با نمونههای مرزی آزمون شوند.
از نظر سازگاری: SQL Server 2012. نکته کارایی اصلی آن چنین است: ستونهای باریک و ایندکس مرتبشده از Spill در Sort جلوگیری میکنند؛ Grant حافظه را پایش کنید.
مطالعه آموزش کامل CUME_DIST با ۱۰ مثال اجرایی و نکات Performance
تابع PERCENT_RANK در SQL Server
PERCENT_RANK برای تبدیل رتبه نسبی به عددی بین صفر و یک برای مقایسه افراد یا اقلام استفاده میشود. CUME_DIST انتهای سهم تجمعی را نشان میدهد؛ PERCENT_RANK از فرمول (RANK-1)/(N-1) استفاده میکند. در طراحی باید ترتیب قطعی، مرز پارتیشن و نوع داده خروجی با نمونههای مرزی آزمون شوند.
از نظر سازگاری: SQL Server 2012. نکته کارایی اصلی آن چنین است: چند تابع پنجرهای با مشخصات یکسان معمولاً Sort را بهاشتراک میگذارند؛ طرح اجرا را برای اطمینان ببینید.
مطالعه آموزش کامل PERCENT_RANK با ۱۰ مثال اجرایی و نکات Performance
تابع PERCENTILE_CONT در SQL Server
PERCENTILE_CONT برای محاسبه میانه و صدکهای عددی با درونیابی میان مقادیر مجاور استفاده میشود. PERCENTILE_DISC یک مقدار موجود را انتخاب میکند؛ PERCENTILE_CONT بین دو مقدار نیز درونیابی میکند. در طراحی باید ترتیب قطعی، مرز پارتیشن و نوع داده خروجی با نمونههای مرزی آزمون شوند.
از نظر سازگاری: SQL Server 2012 و Compatibility Level 110 یا بالاتر. نکته کارایی اصلی آن چنین است: روی داده حجیم، پیشتجمیع معتبر، پارتیشنبندی محدود و کنترل Sort/Spill اثر زیادی بر زمان اجرا دارد.
مطالعه آموزش کامل PERCENTILE_CONT با ۱۰ مثال اجرایی و نکات Performance
تابع PERCENTILE_DISC در SQL Server
PERCENTILE_DISC برای انتخاب مقدار واقعی موجود در مجموعه برای میانه، SLA و آستانههای قابل گزارش استفاده میشود. PERCENTILE_CONT ممکن است درونیابی کند؛ PERCENTILE_DISC نخستین مقدار با توزیع تجمعی کافی را برمیگزیند. در طراحی باید ترتیب قطعی، مرز پارتیشن و نوع داده خروجی با نمونههای مرزی آزمون شوند.
از نظر سازگاری: SQL Server 2012 و Compatibility Level 110 یا بالاتر. نکته کارایی اصلی آن چنین است: کاهش عرض ردیف، ایندکس همراستا و حذف داده نامرتبط پیش از Window Aggregate، هزینه را کنترل میکند.
مطالعه آموزش کامل PERCENTILE_DISC با ۱۰ مثال اجرایی و نکات Performance
شش مثال ترکیبی و کاربردی
مثال 1: مقایسه فروش جاری با دوره قبل
LAG تغییر ماهبهماه را بدون اتصال جدول به خودش محاسبه میکند.
WITH Sales AS
(
SELECT *
FROM (VALUES
(1, N'فروش', CAST('2026-01-01' AS date), 100),
(2, N'فروش', CAST('2026-02-01' AS date), 140),
(3, N'فروش', CAST('2026-03-01' AS date), 120),
(4, N'پشتیبانی', CAST('2026-01-01' AS date), 80),
(5, N'پشتیبانی', CAST('2026-02-01' AS date), 110)
) AS V(Id, Department, SaleDate, Amount)
)
SELECT SaleDate,Amount,Amount-LAG(Amount) OVER(ORDER BY SaleDate,Id) AS ChangeAmount FROM Sales WHERE Department=N'فروش' ORDER BY SaleDate,Id;
| تاریخ | مبلغ | تغییر |
|---|
| 2026-02-01 | 140 | 40 |
نکته کاربردی: ترتیب تاریخ و Id را باهم بنویسید تا نتیجه قطعی باشد.
مثال 2: پیشبینی موعد بعدی با LEAD
LEAD تاریخ رخداد بعدی و فاصله تا آن را کنار رخداد جاری نمایش میدهد.
WITH E AS(SELECT * FROM(VALUES(1,CAST('2026-07-01' AS date)),(2,CAST('2026-07-05' AS date)),(3,CAST('2026-07-20' AS date)))V(Id,EventDate)) SELECT Id,EventDate,LEAD(EventDate) OVER(ORDER BY EventDate,Id) AS NextDate FROM E ORDER BY EventDate,Id;
| رخداد | تاریخ بعدی |
|---|
| 1 | 2026-07-05 |
نکته کاربردی: NULL آخرین ردیف به معنی نبود موعد بعدی در همان پارتیشن است.
مثال 3: مقایسه با اولین و آخرین مقدار
FIRST_VALUE و LAST_VALUE مرز آغاز و پایان هر گروه را کنار تمام ردیفها نگه میدارند.
WITH Sales AS
(
SELECT *
FROM (VALUES
(1, N'فروش', CAST('2026-01-01' AS date), 100),
(2, N'فروش', CAST('2026-02-01' AS date), 140),
(3, N'فروش', CAST('2026-03-01' AS date), 120),
(4, N'پشتیبانی', CAST('2026-01-01' AS date), 80),
(5, N'پشتیبانی', CAST('2026-02-01' AS date), 110)
) AS V(Id, Department, SaleDate, Amount)
)
SELECT SaleDate,Amount,FIRST_VALUE(Amount) OVER(ORDER BY SaleDate,Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS FirstAmount,LAST_VALUE(Amount) OVER(ORDER BY SaleDate,Id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LastAmount FROM Sales WHERE Department=N'فروش' ORDER BY SaleDate,Id;
نکته کاربردی: UNBOUNDED FOLLOWING برای معنای آخرین مقدار کل پارتیشن ضروری است.
مثال 4: تشخیص ۲۰ درصد بالای توزیع
CUME_DIST سهم تجمعی را برای ساخت آستانه نسبی فراهم میکند.
WITH D AS(SELECT * FROM(VALUES(1,40),(2,60),(3,80),(4,100),(5,120))V(Id,Score)),W AS(SELECT *,CUME_DIST() OVER(ORDER BY Score) AS C FROM D) SELECT Id,Score,C FROM W WHERE C>0.8;
نکته کاربردی: تعریف بالای توزیع با تعریف بالای صدک یکی نیست؛ مرز تجاری را صریح کنید.
مثال 5: گروهبندی با PERCENT_RANK
رتبه درصدی برای مقایسه نسبی کارکنان یا مشتریان در جمعیت همسان استفاده میشود.
WITH D AS(SELECT * FROM(VALUES(1,40),(2,60),(3,80),(4,100))V(Id,Score)),W AS(SELECT *,PERCENT_RANK() OVER(ORDER BY Score) AS P FROM D) SELECT Id,Score,CASE WHEN P>=0.75 THEN N'سطح برتر' ELSE N'سطح عادی' END AS Segment FROM W;
نکته کاربردی: اندازه گروه و رفتار tie را در کنار Segment گزارش کنید.
مثال 6: میانه پیوسته و گسسته
دو تابع صدکی روی داده زوج خروجی متفاوت و قابل تفسیر تولید میکنند.
WITH D AS(SELECT Value FROM(VALUES(10),(20),(30),(40))V(Value)) SELECT DISTINCT PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY Value) OVER() AS ContinuousMedian,PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY Value) OVER() AS DiscreteMedian FROM D;
| میانه پیوسته | میانه گسسته |
|---|
| 25 | 20 |
نکته کاربردی: گسسته مقدار واقعی و پیوسته مقدار درونیابیشده را ارائه میکند.
انواع داده، NULL و دقت تحلیل
توابع پنجرهای نوع داده را جادو نمیکنند. اگر Amount از نوع int باشد، تفاضل و مقدار پیشفرض باید از نظر دامنه و تبدیل نوع کنترل شوند؛ برای مبلغ معمولاً decimal مناسبتر است. PERCENTILE_CONT خروجی float(53) دارد و ممکن است مقدار درونیابیشدهای بسازد که در داده خام وجود ندارد.
NULL به معنی نبود داده است و نباید بدون تصمیم کسبوکار به صفر تبدیل شود. در LAG یا LEAD، NULL میتواند مرز پارتیشن یا مقدار واقعی ذخیرهشده باشد. گزینه IGNORE NULLS از SQL Server 2022 به بعد برای برخی توابع قابل استفاده است، ولی نسخه سرور و CU باید پیش از اتکا بررسی شود.
برای تاریخ و زمان، ترتیب با datetime2 معمولاً دقت و دامنه بهتری از datetime قدیمی دارد. اگر رخدادها از مناطق زمانی متفاوت میآیند، ذخیره UTC یا datetimeoffset و تبدیل آگاهانه برای نمایش لازم است. تابع پنجرهای فقط براساس مقداری که به ORDER BY میدهید مرتب میکند و خطای مدل زمانی را اصلاح نمیکند.
گرد کردن درصد یا صدک را تا مرحله نمایش عقب بیندازید. تبدیل زودهنگام float به عدد کمدقت میتواند مرز گروهبندی را تغییر دهد. همچنین Collation و نوع رشته در ترتیب وضعیتها یا نامها اثر دارد؛ برای ترتیب تجاری بهتر است ستون عددی صریح مانند StepNo استفاده شود.
بهینهسازی، ابزارها و سنجش قبل و بعد
پیش از هر تغییر، Query، پارامترها، حجم داده، زمان اجرا، CPU، Logical Reads، Memory Grant و Actual Execution Plan را ثبت کنید. SET STATISTICS IO, TIME ON برای آزمون کنترلشده، Query Store برای تاریخچه تولید و Extended Events برای رخدادهای هدفمند ابزارهای مناسبی هستند.
Sort یکی از هزینههای رایج توابع پنجرهای است. ایندکس بالقوه با ستونهای شرط برابری و PARTITION BY آغاز، با ORDER BY و tie-breaker ادامه و با INCLUDE پوشش داده میشود. با این حال ایندکس اضافه هزینه نوشتن و فضا دارد؛ حذف Sort باید همراه کاهش واقعی IO و زمان سنجیده شود.
هشدار Spill نشان میدهد Sort یا عملگر پنجرهای بخشی از کار را به tempdb منتقل کرده است. علت میتواند برآورد Cardinality نادرست، آمار قدیمی، ردیف بسیار عریض، حافظه ناکافی یا پارامتر حساس باشد. افزایش بیهدف حافظه درمان ریشهای نیست؛ Plan و توزیع داده باید بررسی شوند.
وقتی چند تابع مشخصات پنجره یکسان دارند، قرار دادن آنها در یک Query ممکن است استفاده مشترک از ترتیب را ممکن کند. تفاوت ORDER BY، جهت مرتبسازی یا Frame میتواند Sort جداگانه ایجاد نماید. Actual Plan بهترین شاهد است و نباید صرفاً از روی متن Query نتیجهگیری کرد.
برای مقایسه قبل و بعد، Cache و شرایط اجرا باید قابل مقایسه باشند. حداقل چند بار اجرا، میانه زمان و IO، و نتیجه خروجی یکسان ثبت شود. بهبود روی داده آزمایشی کوچک ممکن است در تولید تکرار نشود، بنابراین آزمون با توزیع و حجم نزدیک به واقعیت لازم است.
بهینهسازی موفق فقط کاهش میلیثانیه نیست؛ باید صحت خروجی، پایداری Plan، مصرف tempdb، همزمانی، هزینه DML و قابلیت نگهداری را باهم بسنجد. یک Query سریع اما دارای Frame اشتباه، شکست کسبوکار است نه موفقیت فنی.
سؤالات متداول
۱. تابع پنجرهای چیست؟
تابعی است که مجموعهای از ردیفهای مرتبط را میبیند و نتیجه را کنار هر ردیف نگه میدارد. بنابراین برخلاف GROUP BY جزئیات رکوردها الزاماً حذف نمیشوند.
۲. تفاوت PARTITION BY و GROUP BY چیست؟
PARTITION BY فقط مرز محاسبه پنجره را تعیین میکند و تعداد ردیف خروجی را کاهش نمیدهد؛ GROUP BY ردیفها را در سطح گروه تجمیع میکند.
۳. آیا توابع Window هزینه توسعه گزارش را کاهش میدهند؟
در بسیاری از پروژهها Self Join، Cursor و پردازش لایه برنامه حذف میشود. ارزش اقتصادی واقعی با سنجش زمان توسعه، نگهداری و منابع قبل و بعد مشخص میگردد.
۴. چه زمانی بازطراحی گزارشهای قدیمی توجیه دارد؟
گزارش پرتکرار، کند یا دارای منطق تکراری نامزد مناسبی است. ارزیابی فنی و مشاوره SQL Server میتواند اولویتها را براساس اثر کسبوکار مرتب کند.
۵. تفاوت توابع Offset، Ranking و Percentile چیست؟
Offset همسایه را میخواند، Ranking جایگاه نسبی را میسنجد و Percentile آستانه توزیع را محاسبه میکند. انتخاب تابع از سؤال تحلیلی آغاز میشود.
۶. برای پیادهسازی سازمانی چه مراحلی لازم است؟
تعریف KPI، نمونه داده مرزی، Query مرجع، آزمون صحت، خط مبنای Performance، طراحی ایندکس و پایش تولید مراحل اصلی هستند؛ آموزش یا خدمات بهینهسازی میتواند این چرخه را استاندارد کند.
۷. خطای رایج در توابع پنجرهای چیست؟
ORDER BY غیرقطعی، Frame اشتباه و فیلتر زودهنگام سه خطای پرتکرارند. هر سه میتوانند بدون خطای Syntax، پاسخ منطقی نادرست بسازند.
۸. چگونه Performance را بررسی کنیم؟
Actual Execution Plan، STATISTICS IO/TIME، Sort، Window Aggregate، Memory Grant و Spill به tempdb را بررسی کنید و نتیجه را با حجم داده واقعی بسنجید.
۹. بهترین روش طراحی Window Specification چیست؟
پارتیشن را از مرز موجودیت، ترتیب را از توالی کسبوکار و Frame را از دامنه مشاهده استخراج کنید. سپس tie، NULL و پارتیشن کوچک را آزمون نمایید.
۱۰. این توابع در چه نسخهای در دسترساند؟
هشت تابع این مجموعه از SQL Server 2012 وجود دارند. IGNORE NULLS برای برخی توابع از SQL Server 2022 اضافه شده و Compatibility Level و CU باید کنترل شود.
سؤالات مصاحبه
Window Function چه تفاوتی با Aggregate دارد؟
Window Function جزئیات ردیف را حفظ میکند، ولی Aggregate بدون Window معمولاً یک ردیف برای هر گروه تولید مینماید. هر دو میتوانند مجموعهای از ردیفها را ببینند، اما شکل خروجی متفاوت است.
چرا LAST_VALUE اغلب پاسخ غیرمنتظره میدهد؟
زیرا Frame پیشفرض در بسیاری از حالتها در ردیف جاری پایان مییابد. برای آخرین مقدار کل پارتیشن باید ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING صریح نوشته شود.
چگونه Query پنجرهای را ایندکس میکنید؟
از فیلترها، PARTITION BY، ORDER BY، tie-breaker و ستونهای خروجی الگوی اولیه میسازم و سپس با Actual Plan و STATISTICS IO/TIME آن را تأیید میکنم. اثر روی DML نیز اندازهگیری میشود.
CUME_DIST و PERCENT_RANK چه تفاوتی دارند؟
CUME_DIST تعداد ردیفهای با مقدار کمتر یا مساوی را بر کل ردیفها تقسیم میکند؛ PERCENT_RANK از فرمول مبتنی بر RANK استفاده میکند و ردیف نخست صفر است.
میانه پیوسته و گسسته کدام مناسبتر است؟
برای تحلیل آماری عددی معمولاً PERCENTILE_CONT مناسب است؛ برای آستانهای که باید دقیقاً یک مقدار موجود مانند سطح قیمت یا رده خدمت باشد، PERCENTILE_DISC معنادارتر است.
جمعبندی و مسیر مطالعه
توابع تحلیلی SQL Server زبان مستقیمی برای مقایسه زمانی، مشاهده مرزها، رتبهبندی نسبی و تحلیل توزیع فراهم میکنند. سه تصمیم تعیینکننده عبارتاند از جمعیت پارتیشن، ترتیب قطعی و Frame درست. پس از اثبات صحت، ایندکس و Plan برای رسیدن به SLA بهینه میشوند.
برای یادگیری عمیق، مقاله هر تابع را همراه ده مثال مستقل اجرا کنید و نتیجه را با داده پروژه خود مقایسه نمایید.