برنامه نویسی

بررسی سریع توابع پنجره SQL با مثال

توابع پنجره یک ویژگی قدرتمند در SQL هستند که برای انجام محاسبات در مجموعه ای از ردیف های مربوط به ردیف فعلی استفاده می شود. برخلاف توابع جمع، توابع پنجره ردیف ها را در یک خروجی گروه بندی نمی کنند. آنها یک نتیجه را برای هر ردیف در حالی که زمینه مجموعه داده را حفظ می کنند، برمی گردانند.

در این مقاله، ما برخی از توابع رایج پنجره SQL را بررسی خواهیم کرد (ROW_NUMBER()، RANK()، DENSE_RANK()، NTILE()، LEAD()، و LAG()) با مثال.

ما از جدول فروش زیر برای نشان دادن عملکردهای پنجره استفاده می کنیم:

شناسه فروش شناسه مشتری محصول منطقه مقدار تاریخ فروش
1 101 لپ تاپ شمال 1200 05/01/2023
2 102 تبلت شمال 800 15-02-2023
3 103 تلفن شمال 800 2023-03-10
4 104 تبلت شمال 500 01-04-2023
5 105 لپ تاپ جنوب 1300 05-05-2023
6 106 تبلت جنوب 700 2023-06-20
7 107 تلفن غرب 900 15-07-2023
8 108 لپ تاپ شرق 1300 10-08-2023

تابع ROW_NUMBER() یک عدد منحصر به فرد به هر سطر در یک پارتیشن اختصاص می دهد که توسط یک ستون مشخص مرتب شده است.

وظیفه: یک شماره ردیف منحصر به فرد به هر فروش در یک منطقه بر اساس مبلغ فروش (بیشترین به کمترین) اختصاص دهید.

SELECT SalesID, Region, Amount,
       ROW_NUMBER() OVER (PARTITION BY Region ORDER BY Amount DESC) AS RowNum
FROM Sales;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه:

شناسه فروش منطقه مقدار تعداد ردیف
1 شمال 1200 1
2 شمال 800 2
3 شمال 800 3
4 شمال 500 4
5 جنوب 1300 1
6 جنوب 700 2
7 غرب 900 1
8 شرق 1300 1

تابع RANK() یک رتبه به هر ردیف در یک پارتیشن اختصاص می دهد. ردیف هایی با مقادیر یکسان رتبه یکسانی را دریافت می کنند و رتبه بعدی حذف می شود.

وظیفه: رتبه بندی فروش در هر منطقه بر اساس مقدار (بالاترین به کمترین).

SELECT SalesID, Region, Amount,
       RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS Rank
FROM Sales;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه:

شناسه فروش منطقه مقدار رتبه
1 شمال 1200 1
2 شمال 800 2
3 شمال 800 2
4 شمال 500 4
5 جنوب 1300 1
6 جنوب 700 2
7 غرب 900 1
8 شرق 1300 1

ویژگی کلیدی:

  • برای منطقه شمال، هر دو Amount = 800 ردیف رتبه 2 را به اشتراک می گذارند.
  • رتبه بعدی حذف می شود (یعنی رتبه 3 وجود ندارد) و به 4 می پرد. # 3. DENSE_RANK()

تابع DENSE_RANK() رتبه هایی مانند RANK() را اختصاص می دهد، اما از رتبه های بعد از تساوی ها نمی گذرد.

وظیفه: رتبه های متراکم را به میزان فروش در هر منطقه اختصاص دهید (بالاترین به پایین ترین).

SELECT SalesID, Region, Amount,
       DENSE_RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS DenseRank
FROM Sales;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه:

شناسه فروش منطقه مقدار DenseRank
1 شمال 1200 1
2 شمال 800 2
3 شمال 800 2
4 شمال 500 3
5 جنوب 1300 1
6 جنوب 700 2
7 غرب 900 1
8 شرق 1300 1

ویژگی کلیدی:

  • برای منطقه شمال، هر دو Amount = 800 ردیف رتبه 2 را به اشتراک می گذارند.
  • رتبه بعدی 3 بدون رد شدن از رتبه است.

NTILE () ردیف ها را به تعداد مشخصی از گروه های تقریباً مساوی تقسیم می کند.

وظیفه: تمام فروش ها را بر اساس مقدار به ترتیب نزولی به 4 گروه تقسیم کنید.

SELECT SalesID, Amount,
       NTILE(4) OVER (ORDER BY Amount DESC) AS Quartile
FROM Sales;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه:

شناسه فروش مقدار چارک
5 1300 1
8 1300 1
1 1200 2
7 900 2
2 800 3
3 800 3
4 500 4
6 700 4

LEAD() مقدار را از ردیف بعدی در همان پارتیشن بازیابی می کند.

وظیفه: هر مبلغ فروش را با مبلغ فروش بعدی که توسط SaleDate سفارش داده شده است مقایسه کنید.

SELECT SalesID, Amount, 
       LEAD(Amount) OVER (ORDER BY SaleDate) AS NextAmount
FROM Sales;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه:

شناسه فروش مقدار NextAmount
1 1200 800
2 800 800
3 800 500
4 500 1300
5 1300 700
6 700 900
7 900 1300
8 1300 NULL

LAG() مقدار را از ردیف قبلی در همان پارتیشن بازیابی می کند.

وظیفه: هر مبلغ فروش را با مبلغ فروش قبلی که توسط SaleDate سفارش داده شده است مقایسه کنید.

SELECT SalesID, Amount, 
       LAG(Amount) OVER (ORDER BY SaleDate) AS PrevAmount
FROM Sales;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه:

شناسه فروش مقدار PrevAmount
1 1200 NULL
2 800 1200
3 800 800
4 500 800
5 1300 500
6 700 1300
7 900 700
8 1300 900

توابع پنجره SQL مانند ROW_NUMBER()، RANK()، DENSE_RANK()، NTILE()، LEAD()، و LAG() راه های قدرتمندی برای تجزیه و تحلیل داده ها در پارتیشن ها ارائه می دهند.

نکات کلیدی:

  • ROW_NUMBER() برای هر ردیف یک شناسه منحصر به فرد اختصاص می دهد.
  • RANK() و DENSE_RANK() در نحوه برخورد آنها با کراوات متفاوت است (پرش در مقابل عدم جست و خیز).
  • NTILE() برای تقسیم ردیف ها به گروه های آماری مفید است.
  • LEAD() و LAG() اجازه مقایسه با ردیف های مجاور را می دهد.

با تسلط بر این توابع، می توانید تجزیه و تحلیل پیچیده و وظایف رتبه بندی را به طور موثر انجام دهید!


بیشتر کاوش کنید

تصویر luca1iu

از اینکه وقت گذاشتید و اطلاعات مربوط به داده ها را با من کاوش کردید متشکرم. من از نامزدی شما قدردانی می کنم.

🚀 در لینکدین با من در ارتباط باشید

https%3A%2F%2Fimg.buymeacoffee

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا