توابع تحلیلی FIRST_VALUE و LAST_VALUE
در این مبحث به بررسی اجمالی توابع تحلیلی FIRST_VALUE و LAST_VALUE میپردازیم.
FIRST_VALUE
تابع تحلیلگر FIRST_VALUE مشابه تابع تحلیلی FIRST است که امکان بازگرداندن اولین نتیجه از لیست درخواستی را میدهد.
SELECT empno,
deptno,
sal,
FIRST_VALUE(sal) IGNORE NULLS
OVER (PARTITION BY deptno ORDER BY sal) AS lowest_in_dept
FROM emp;
EMPNO DEPTNO SAL LOWEST_IN_DEPT
———- ———- ———- ————–
۷۹۳۴ ۱۰ ۱۳۰۰ ۱۳۰۰
۷۷۸۲ ۱۰ ۲۴۵۰ ۱۳۰۰
۷۸۳۹ ۱۰ ۵۰۰۰ ۱۳۰۰
۷۳۶۹ ۲۰ ۸۰۰ ۸۰۰
۷۸۷۶ ۲۰ ۱۱۰۰ ۸۰۰
۷۵۶۶ ۲۰ ۲۹۷۵ ۸۰۰
۷۷۸۸ ۲۰ ۳۰۰۰ ۸۰۰
۷۹۰۲ ۲۰ ۳۰۰۰ ۸۰۰
۷۹۰۰ ۳۰ ۹۵۰ ۹۵۰
۷۶۵۴ ۳۰ ۱۲۵۰ ۹۵۰
۷۵۲۱ ۳۰ ۱۲۵۰ ۹۵۰
۷۸۴۴ ۳۰ ۱۵۰۰ ۹۵۰
۷۴۹۹ ۳۰ ۱۶۰۰ ۹۵۰
۷۶۹۸ ۳۰ ۲۸۵۰ ۹۵۰
SQL>
عبارت {RESPECT | IGNORE} NULLS مورد اشاره در مثال فوق نحوه برخورد با مقادیر NULL احتمالی در لیست درخواستی را مشخص میکند.
عبارت Windowing نیز چارچوب اجرای فرآیند را مشخص میکند. عبارت ROWS 1 PRECEDING استفاده شده در مثال زیر نتیجه مشابه ولی نه کاملاً همسان با عبارت LAG of 1 row دارد.
SELECT empno,
deptno,
sal,
FIRST_VALUE(sal) IGNORE NULLS
OVER (PARTITION BY deptno ORDER BY sal ROWS 1 PRECEDING) AS preceding_in_dept
FROM emp;
EMPNO DEPTNO SAL PRECEDING_IN_DEPT
———- ———- ———- —————–
۷۹۳۴ ۱۰ ۱۳۰۰ ۱۳۰۰
۷۷۸۲ ۱۰ ۲۴۵۰ ۱۳۰۰
۷۸۳۹ ۱۰ ۵۰۰۰ ۲۴۵۰
۷۳۶۹ ۲۰ ۸۰۰ ۸۰۰
۷۸۷۶ ۲۰ ۱۱۰۰ ۸۰۰
۷۵۶۶ ۲۰ ۲۹۷۵ ۱۱۰۰
۷۷۸۸ ۲۰ ۳۰۰۰ ۲۹۷۵
۷۹۰۲ ۲۰ ۳۰۰۰ ۳۰۰۰
۷۹۰۰ ۳۰ ۹۵۰ ۹۵۰
۷۶۵۴ ۳۰ ۱۲۵۰ ۹۵۰
۷۵۲۱ ۳۰ ۱۲۵۰ ۱۲۵۰
۷۸۴۴ ۳۰ ۱۵۰۰ ۱۲۵۰
۷۴۹۹ ۳۰ ۱۶۰۰ ۱۵۰۰
۷۶۹۸ ۳۰ ۲۸۵۰ ۱۶۰۰
SQL>
LAST_VALUE
تابع تحلیلگر LAST_VALUE همانند تابع تحلیلی LAST امکان بازگرداندن آخرین نتیجه از لیست درخواستی را مهیا میسازد.
توجه شود که نتیجه بازگردانده شده مثال زیر تا حدودی دور از انتظار است.
SELECT empno,
deptno,
sal,
LAST_VALUE(sal) IGNORE NULLS
OVER (PARTITION BY deptno ORDER BY sal) AS highest_in_dept
FROM emp;
EMPNO DEPTNO SAL HIGHEST_IN_DEPT
———- ———- ———- —————
۷۹۳۴ ۱۰ ۱۳۰۰ ۱۳۰۰
۷۷۸۲ ۱۰ ۲۴۵۰ ۲۴۵۰
۷۸۳۹ ۱۰ ۵۰۰۰ ۵۰۰۰
۷۳۶۹ ۲۰ ۸۰۰ ۸۰۰
۷۸۷۶ ۲۰ ۱۱۰۰ ۱۱۰۰
۷۵۶۶ ۲۰ ۲۹۷۵ ۲۹۷۵
۷۷۸۸ ۲۰ ۳۰۰۰ ۳۰۰۰
۷۹۰۲ ۲۰ ۳۰۰۰ ۳۰۰۰
۷۹۰۰ ۳۰ ۹۵۰ ۹۵۰
۷۶۵۴ ۳۰ ۱۲۵۰ ۱۲۵۰
۷۵۲۱ ۳۰ ۱۲۵۰ ۱۲۵۰
۷۸۴۴ ۳۰ ۱۵۰۰ ۱۵۰۰
۷۴۹۹ ۳۰ ۱۶۰۰ ۱۶۰۰
۷۶۹۸ ۳۰ ۲۸۵۰ ۲۸۵۰
SQL>
به این علت که چارچوب پیشفرض اجرای فرآیند برابر “RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW” است که بازهی تحلیلی بین بینهایت مقدار گذشته و سطر کنونی میباشد. همانطور که در مثال قبل مشاهده نمودید تفسیر فرآیند اجرایی آن به صورت سطر اول با مقدار سطر کنونی که بالطبع به عنوان سطر آخر در نظر گرفته میشود است.
با تغییر چارچوب فرآیند اجرایی به “RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING” نتیجه مورد انتظار به دست میآید.
SELECT empno,
deptno,
sal,
LAST_VALUE(sal) IGNORE NULLS
OVER (PARTITION BY deptno ORDER BY sal RANGE BETWEEN
UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS highest_in_dept
FROM emp;
EMPNO DEPTNO SAL HIGHEST_IN_DEPT
———- ———- ———- —————
۷۹۳۴ ۱۰ ۱۳۰۰ ۵۰۰۰
۷۷۸۲ ۱۰ ۲۴۵۰ ۵۰۰۰
۷۸۳۹ ۱۰ ۵۰۰۰ ۵۰۰۰
۷۳۶۹ ۲۰ ۸۰۰ ۳۰۰۰
۷۸۷۶ ۲۰ ۱۱۰۰ ۳۰۰۰
۷۵۶۶ ۲۰ ۲۹۷۵ ۳۰۰۰
۷۷۸۸ ۲۰ ۳۰۰۰ ۳۰۰۰
۷۹۰۲ ۲۰ ۳۰۰۰ ۳۰۰۰
۷۹۰۰ ۳۰ ۹۵۰ ۲۸۵۰
۷۶۵۴ ۳۰ ۱۲۵۰ ۲۸۵۰
۷۵۲۱ ۳۰ ۱۲۵۰ ۲۸۵۰
۷۸۴۴ ۳۰ ۱۵۰۰ ۲۸۵۰
۷۴۹۹ ۳۰ ۱۶۰۰ ۲۸۵۰
۷۶۹۸ ۳۰ ۲۸۵۰ ۲۸۵۰
SQL>
همانند مثال قبل عبارت {RESPECT | IGNORE} NULLS نحوه برخورد با مقادیر احتمالی NULL در لیست درخواستی را مشخص میکند که در حالت پیشفرض برابر RESPECT NULLS است.