paint-brush
توابع پنجره SQL: بررسی سریع با مثالتوسط@luca1iu
تاریخ جدید

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

توسط Luca Liu5m2025/01/05
Read on Terminal Reader

خیلی طولانی؛ خواندن

توابع پنجره یک ویژگی قدرتمند در SQL هستند که برای انجام محاسبات در مجموعه ای از ردیف های مربوط به ردیف فعلی استفاده می شود. برخلاف توابع جمع، توابع پنجره ردیف ها را در یک خروجی گروه بندی نمی کنند. آنها یک نتیجه را برای هر ردیف در حالی که زمینه مجموعه داده را حفظ می کنند، برمی گردانند.
featured image - توابع پنجره SQL: بررسی سریع با مثال
Luca Liu HackerNoon profile picture


مقدمه

توابع پنجره یک ویژگی قدرتمند در 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

1. ROW_NUMBER()

تابع 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

2. RANK()

تابع 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 بدون رد شدن از رتبه است.

4. NTILE()

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

5. LEAD()

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

6. LAG()

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() اجازه مقایسه با ردیف های مجاور را می دهند.


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


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

L O A D I N G
. . . comments & more!

About Author

Luca Liu HackerNoon profile picture
Luca Liu@luca1iu
Hello there! 👋 I'm Luca, a BI Developer with a passion for all things data, Proficient in Python, SQL and Power BI

برچسب ها را آویزان کنید

این مقاله در ارائه شده است...