تابع پنجره (اس‌کیوال)

در زبان SQL یک تابع پنجره یا تابع تحلیلی[۱] تابعی است که از مقادیر یک یا چند سطر برای برگرداندن مقداری برای هر سطر استفاده می‌کند. (این در تضاد با یک تابع جمع است که یک مقدار واحد را برای چندین ردیف برمی‌گرداند) توابع پنجره دارای یک عبارت OVER هستند. هر تابع بدون عبارت OVER یک تابع پنجره نیست، بلکه یک تابع تجمیعی یا تک ردیفی (اسکالر) است.[۲]

به عنوان مثال، در اینجا یک پرس و جو وجود دارد که از یک تابع پنجره برای مقایسه هر کارمند با میانگین حقوق بخش خود استفاده می‌کند (مثالی از اسناد PostgreSQL):[۳]

SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;

خروجی برنامه فوق چنین است:

| depname | empno | salary | avg
----------------------+--------+-------+-------------
develop | 11 | 5200 | 5020.0000000000000000
develop | 7 | 4200 | 5020.0000000000000000
develop | 9 | 4500 | 5020.0000000000000000
develop | 8 | 6000 | 5020.0000000000000000
develop | 10 | 5200 | 5020.0000000000000000
personnel | 5 | 3500 | 3700.0000000000000000
personnel | 2 | 3900 | 3700.0000000000000000
sales | 3 | 4800 | 4866.6666666666666667
sales | 1 | 5000 | 4866.6666666666666667
sales | 4 | 4800 | 4866.6666666666666667
(10 rows)

عبارت PARTITION BY ردیف‌ها را به پارتیشن‌ها گروه‌بندی می‌کند و تابع به‌طور جداگانه برای هر پارتیشن اعمال می‌شود. اگر PARTITION BY حذف شود (مثلاً اگر یک OVER() خالی داشته باشیم، کل مجموعه نتیجه به عنوان یک پارتیشن واحد در نظر گرفته می‌شود.[۴] برای این پرس و جو، متوسط حقوق گزارش شده، میانگین دریافتی در تمام ردیف‌ها خواهد بود.

توابع پنجره پس از تجمیع ارزیابی می‌شوند (مثلاً بعد از <code id="mwHg">GROUP BY</code> و توابع مجموع غیر پنجره).[۱]

نحو ویرایش

با توجه به مستندات PostgreSQL، یک تابع پنجره دارای نحو یکی از موارد زیر است:[۴]

function_name ([expression [, expression ...]]) OVER window_name
function_name ([expression [, expression ...]]) OVER ( window_definition )
function_name ( * ) OVER window_name
function_name ( * ) OVER ( window_definition )

کلیدواژه WHERE دارای نحو بشکل زیر است:

[existing_window_name]
[ PARTITION BY expression [, ...] ]
[ ORDER BY expression [ASC | DESC | USING operator] [NULLS { FIRST | LAST }] [, ...] ]
[frame_clause]

frame_clause دارای نحو بشکل یکی از موارد زیر است:

{ RANGE | ROWS | GROUPS } frame_start [frame_exclusion]
{ RANGE | ROWS | GROUPS } BETWEEN frame_start AND frame_end [frame_exclusion]

منابع ویرایش

  1. ۱٫۰ ۱٫۱ "Analytic function concepts in Standard SQL | BigQuery". Google Cloud (به انگلیسی). Retrieved 2021-03-23. خطای یادکرد: برچسب <ref> نامعتبر؛ نام «:1» چندین بار با محتوای متفاوت تعریف شده است. (صفحهٔ راهنما را مطالعه کنید.).
  2. "Window Functions". sqlite.org. Retrieved 2021-03-23.
  3. "3.5. Window Functions". PostgreSQL Documentation (به انگلیسی). 2021-02-11. Retrieved 2021-03-23.
  4. ۴٫۰ ۴٫۱ "4.2. Value Expressions". PostgreSQL Documentation (به انگلیسی). 2021-02-11. Retrieved 2021-03-23. خطای یادکرد: برچسب <ref> نامعتبر؛ نام «:0» چندین بار با محتوای متفاوت تعریف شده است. (صفحهٔ راهنما را مطالعه کنید.).