محاسبات پیشرفته با توابع پنجرهای
Window Function نوعی تابع محاسباتی است که برخلاف GROUP BY، ردیفها را در نتیجه ادغام نمیکند، بلکه یک مقدار محاسبهشده را در کنار هر ردیف اصلی نمایش میدهد. این ابزار برای رتبهبندی، محاسبهی مجموع تجمعی و مقایسه با ردیف قبل و بعد بسیار کاربردی است.
تابع ROW_NUMBER برای شمارهگذاری ردیفها بر اساس یک ترتیب مشخص استفاده میشود؛ مثلاً پیدا کردن پرفروشترین محصول هر دستهبندی:
SELECT Name, CategoryId, Price,
ROW_NUMBER() OVER (PARTITION BY CategoryId ORDER BY Price DESC) AS Rank
FROM Products;
عبارت PARTITION BY محاسبه را در هر دستهبندی جداگانه از نو شروع میکند، درست مانند GROUP BY اما بدون ادغام ردیفها. توابع RANK و DENSE_RANK نیز مشابه ROW_NUMBER هستند با این تفاوت که در صورت تساوی مقدار، رتبهی یکسانی میدهند.
یکی دیگر از کاربردهای رایج، محاسبهی مجموع تجمعی (running total) با SUM همراه با OVER است:
SELECT OrderDate, Total,
SUM(Total) OVER (ORDER BY OrderDate) AS RunningTotal
FROM Orders;
توابع LAG و LEAD نیز مقدار ردیف قبلی یا بعدی را در همان دسته برمیگردانند که برای محاسبهی تغییرات بین دورهها (مثلاً رشد فروش نسبت به روز قبل) بسیار مفید است. تسلط بر Window Function یکی از مهارتهای کلیدی برای نوشتن گزارشهای تحلیلی حرفهای است.