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

در زبان 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]

منابع

اس‌کیوال