"

شش مفهوم کلیدی برای تسلط بر Window Functions در SQL Server, استفاده از PARTITION BY برای گروه‌بندی هوشمند,Frame یا محدوده محاسباتی (ROWS و RANGE)

شش مفهوم کلیدی برای تسلط بر Window Functions در SQL Server

Window Functions یکی از مهم‌ترین قابلیت‌های SQL Server برای انجام محاسبات تحلیلی روی داده‌ها هستند.

تیم تحریریه
7
0
29 تیر 1405
لینک کوتاه

 شش مفهوم کلیدی برای تسلط بر Window Functions در SQL Server

یکی از قدرتمندترین قابلیت‌های SQL Server، Window Functions یا توابع پنجره‌ای هستند.
این توابع به توسعه‌دهندگان و تحلیلگران داده اجازه می‌دهند بدون نیاز به زیرپرس‌وجوهای پیچیده (Subquery)، جداول موقت یا Self Join، محاسبات پیشرفته‌ای را روی مجموعه‌ای از رکوردها انجام دهند.
در پروژه‌های واقعی، از تهیه گزارش‌های مالی گرفته تا تحلیل رفتار کاربران، رتبه‌بندی، محاسبه میانگین متحرک و مقایسه داده‌ها، Window Functions نقش بسیار مهمی ایفا می‌کنند.

برخلاف توابع تجمیعی مانند SUM یا AVG که معمولاً تعداد سطرهای خروجی را کاهش می‌دهند، توابع پنجره‌ای نتیجه را برای هر سطر حفظ می‌کنند و در عین حال اطلاعاتی درباره سایر سطرهای مرتبط در اختیار شما قرار می‌دهند.
به همین دلیل، یادگیری صحیح این قابلیت یکی از مهارت‌های ضروری برای هر برنامه‌نویس SQL Server محسوب می‌شود.



 شش مفهوم کلیدی برای تسلط بر Window Functions در SQL Server

درک مفهوم OVER؛ قلب Window Functions

تمام توابع پنجره‌ای در SQL Server با عبارت () OVER کار می‌کنند.
این عبارت مشخص می‌کند که تابع روی چه محدوده‌ای از داده‌ها اجرا شود.

نمونه ساده:

 

SELECT

EmployeeName,

Salary,

AVG(Salary) OVER() AS AvgSalary

FROM Employees;

 

در این مثال، میانگین حقوق تمام کارکنان محاسبه می‌شود، اما برخلاف دستور GROUP BY ، تمام رکوردهای جدول همچنان در خروجی باقی می‌مانند.

خروجی به شکل زیر خواهد بود:

 نام  حقوق میانگین
 علی 4000 5200
 رضا 6000 5200
 سارا 5600  5200

 

اگر همین کار را با GROUP BY انجام دهیم تنها یک سطر خروجی خواهیم داشت، اما Window Function مقدار میانگین را کنار هر سطر نمایش می‌دهد.

در واقع، () OVER  تعیین می‌کند که پنجره محاسباتی چگونه ساخته شود.
بدون این عبارت، تقریباً هیچ Window Function قابل استفاده نیست.


 

🌟 آیا می‌خواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟

با دوره آموزشی SQL Server ما، شما می‌توانید به راحتی و با روشی عملی، تمام مهارت‌های لازم را یاد بگیرید!

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

با محتوای جذاب و پروژه‌های واقعی، شما نه تنها تئوری را یاد می‌گیرید، بلکه توانایی‌های عملی خود را نیز تقویت می‌کنید.

پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشن‌تر بردارید!

 همین حالا شروع کنید و به دنیای داده‌ها بپیوندید!




 استفاده از PARTITION BY برای گروه‌بندی هوشمند

یکی از مهم‌ترین بخش‌های عبارت OVER،  دستور PARTITION BY است.

این دستور داده‌ها را به چند بخش مستقل تقسیم می‌کند و تابع پنجره‌ای را روی هر بخش جداگانه اجرا می‌کند.

فرض کنید کارکنان در چند دپارتمان فعالیت می‌کنند.

 

SELECT

EmployeeName,

Department,

Salary,

AVG(Salary) OVER(PARTITION BY Department) AS AvgDeptSalary

FROM Employees;

 

 

اگر جدول به شکل زیر باشد:


 نام   دپارتمان حقوق
 علی IT 5000
 رضا  IT 7000
سارا HR 4000
 مریم HR 6000

 

 

خروجی:

نام  دپارتمان حقوق میانگین
علی IT 6000 5000
رضا IT 7000  6000
 سارا  HR  4000 5000
مریم HR  6000 5000

 

 

 

در اینجا هر دپارتمان مانند یک پنجره مستقل در نظر گرفته شده است.

این قابلیت در گزارش‌های سازمانی، تحلیل فروش شعب، محاسبه میانگین حقوق، بررسی عملکرد تیم‌ها و بسیاری از سناریوهای تحلیلی کاربرد دارد.

 

 

 اهمیت ORDER BY در Window Functions

بسیاری از توابع پنجره‌ای بدون مرتب‌سازی معنی ندارند. به همین دلیل از ORDER BY  در داخل OVER استفاده می‌شود.

 

مثال:

SELECT

EmployeeName,

Salary,

ROW_NUMBER() OVER(ORDER BY Salary DESC) AS RowNum

FROM Employees;

 

 

نتیجه:

نام  حقوق شماره
 رضا  7000  1
سارا 6500   2 
علی 5000 3

 

 

وجود ORDER BY باعث می‌شود SQL Server ترتیب اجرای تابع را بداند.

این بخش در توابع زیر اهمیت زیادی دارد:

 

  • ROW_NUMBER
  • RANK
  • DENSE_RANK
  • LAG
  • LEAD
  • FIRST_VALUE
  • LAST_VALUE

در صورت حذف ORDER BY ، بسیاری از این توابع قابل اجرا نیستند یا خروجی قابل اعتمادی نخواهند داشت.

 

 

آشنایی با توابع رتبه‌بندی (Ranking Functions)  در SQL Server

یکی از محبوب‌ترین انواع Window Functions، توابع رتبه‌بندی هستند.

چهار تابع مهم در این گروه عبارت‌اند از:

 

  • ()ROW_NUMBE

    برای هر رکورد یک شماره یکتا تولید می‌کند.

 

 

SELECT

EmployeeName,

Salary,

ROW_NUMBER() OVER(ORDER BY Salary DESC)

FROM Employees;

 

 

 

 

  • ()RANK

    در صورت برابر بودن مقادیر، رتبه تکراری اختصاص می‌دهد و رتبه بعدی را رد می‌کند.
    نمونه:

حقوق:

7000
 
7000
 
6000

 

رتبه‌ها:

1
 
1
 
3

 

  • ()DENSE_RANK

    مشابه RANK است اما شماره‌ای را حذف نمی‌کند.
    نتیجه:
 
1
 
1
 
2
 

 

 

  • ()NTILE

برای تقسیم داده‌ها به چند گروه مساوی استفاده می‌شود.

 

 

SELECT

EmployeeName,

Salary,

NTILE(4) OVER(ORDER BY Salary DESC)

FROM Employees;

 

این تابع در تحلیل داده، دسته‌بندی مشتریان و گزارش‌های مدیریتی بسیار کاربرد دارد.



آشنایی با توابع رتبه‌بندی (Ranking Functions) در SQL Server



استفاده از توابع تحلیلی LAG و LEAD  در SQL Server

در گذشته برای مقایسه رکورد فعلی با رکورد قبلی مجبور بودیم از Self Join استفاده کنیم.

امروزه با LAG و LEAD این کار بسیار ساده شده است.

 

  • LAG

    رکورد قبلی را نمایش می‌دهد.

 

 

SELECT

OrderDate,

SalesAmount,

LAG(SalesAmount) OVER(ORDER BY OrderDate)

FROM Sales;

 

نمونه خروجی:

تاریخ فروش فروش قبلی
 1 تیر 100  NULL
 2 تیر 130 100
3 تیر  170  130 

 

 

  • LEAD

    رکورد بعدی را برمی‌گرداند.

 



SELECT

OrderDate,

SalesAmount,

LEAD(SalesAmount) OVER(ORDER BY OrderDate)

FROM Sales;

 

این توابع در تحلیل روند فروش، بررسی رشد درآمد، مقایسه قیمت‌ها و تحلیل داده‌های زمانی بسیار پرکاربرد هستند.

 

Frame یا محدوده محاسباتی (ROWS و RANGE)

یکی از مفاهیم پیشرفته Window Functions تعیین محدوده‌ای است که تابع روی آن اجرا می‌شود.

به طور پیش‌فرض SQL Server ممکن است کل پنجره را در نظر بگیرد، اما با استفاده از ROWS  یا RANGE می‌توان محدوده دقیق‌تری تعریف کرد.

مثلاً محاسبه مجموع تجمعی:

 

 

SELECT

OrderDate,

Amount,

SUM(Amount)

OVER(

ORDER BY OrderDate

ROWS BETWEEN UNBOUNDED PRECEDING

AND CURRENT ROW

)

FROM Orders;

 

فرض کنید فروش‌ها به شکل زیر باشد:

 تاریخ مبلغ
روز اول 100
روز دوم 200
روز سوم 150

 

 

خروجی:

تاریخ   مبلغ مجموع تجمعی
روز اول 100 100
روز دوم 200 300 
روز سوم 150 450 

 

همچنین می‌توان میانگین سه رکورد آخر را نیز محاسبه کرد.

 

AVG(Amount)

OVER(

ORDER BY OrderDate

ROWS BETWEEN 2 PRECEDING

AND CURRENT ROW

)

 

این تکنیک در محاسبه میانگین متحرک، تحلیل بازارهای مالی، پیش‌بینی روند فروش و داشبوردهای مدیریتی کاربرد فراوانی دارد.

 

 

 

نکات مهم برای بهینه‌سازی Window Functions

اگرچه Window Functions ابزار بسیار قدرتمندی هستند، اما در جداول بزرگ ممکن است هزینه پردازشی قابل توجهی داشته باشند.
رعایت چند نکته می‌تواند عملکرد آن‌ها را بهبود دهد:

  • روی ستون‌هایی که در ORDER BY یا PARTITION BY استفاده می‌شوند ایندکس مناسب ایجاد کنید.
  • از Window Function فقط زمانی استفاده کنید که واقعاً به محاسبات سطری نیاز دارید.
  • از اجرای هم‌زمان تعداد زیادی Window Function روی میلیون‌ها رکورد بدون بررسی پلن اجرا (Execution Plan) خودداری کنید.
  • در صورت امکان، محاسبات تکراری را در یک عبارت مشترک (CTE) یا View سازمان‌دهی کنید تا خوانایی و نگهداری کد افزایش یابد.
  • همواره عملکرد پرس‌وجو را با داده‌های واقعی بررسی کنید، زیرا نوع ایندکس، حجم داده و نسخه SQL Server می‌تواند تأثیر زیادی بر سرعت اجرای توابع پنجره‌ای داشته باشد.


نکات مهم برای بهینه‌سازی Window Functions

جمع‌بندی

Window Functions یکی از ارزشمندترین امکانات SQL Server هستند که می‌توانند بسیاری از مسائل تحلیلی و گزارش‌گیری را با کدی ساده، خوانا و بهینه حل کنند.

درک صحیح شش مفهوم کلیدی شامل عبارت OVER ، استفاده از PARTITION BY ، مرتب‌سازی با  ORDER BY ، توابع رتبه‌بندی، توابع تحلیلی  LAG  و LEAD  و همچنین تعیین محدوده محاسباتی با ROWS و  RANGE ، پایه‌ای محکم برای استفاده حرفه‌ای از این قابلیت فراهم می‌کند.

تسلط بر این مفاهیم نه‌تنها باعث کاهش پیچیدگی کوئری‌ها و حذف بسیاری از زیرپرس‌وجوها می‌شود، بلکه به بهبود خوانایی، نگهداری و در بسیاری از سناریوها افزایش کارایی نیز کمک می‌کند.
اگر به‌صورت مستمر با گزارش‌های مدیریتی، تحلیل داده یا توسعه سامانه‌های مبتنی بر SQL Server کار می‌کنید، یادگیری عمیق Window Functions یکی از بهترین سرمایه‌گذاری‌ها برای ارتقای مهارت‌های فنی شما خواهد بود.

محصولات مرتبط

کاربران ما

شما هم نظرتون با ما دریاره “شش مفهوم کلیدی برای تسلط بر Window Functions در SQL Server” اشتراک بزارید

برای ارسال نظر لطفا ورود یا ثبت نام کنید

منو