توابع پنجره یک ویژگی قدرتمند در 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 |
ویژگی کلیدی :
تابع 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 |
ویژگی کلیدی :
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()
اجازه مقایسه با ردیف های مجاور را می دهند.
با تسلط بر این توابع، می توانید تجزیه و تحلیل پیچیده و وظایف رتبه بندی را به طور موثر انجام دهید!
از اینکه وقت گذاشتید و اطلاعات مربوط به داده ها را با من کاوش کردید متشکرم. من از نامزدی شما قدردانی می کنم. اگر این اطلاعات را مفید میدانید، از شما دعوت میکنم من را دنبال کنید یا در لینکدین با من ارتباط برقرار کنید. کاوش مبارک!👋