LAG FUNCTION
------------------------
Syntax: LAG (VALUE EXPRESSION[, OFFSET, DEFAULT[) [RESPECT/IGNORE NULLS] OVER ([QUERY_PARTITION_CLAUSE] ORDER_BY_CLAUSE).................
⦁ Single Row function একটা মাত্র row কে process করে এবং একটি মাত্র value রিটার্ন করে।
⦁ Multiple Row Function একাধিক row কে process করে এবং একটি মাত্র value রিটার্ন করে।
⦁ Analytic Function একাধিক row কে process করে এবং প্রত্যেক row এর বিপরীতে একটি value রিটার্ন করে।
Lag একটি analytic function. এর দ্বারা self join ছাড়া একই সময়ে একাধিক row কে access করা যায়। এই function টি একাধিক row কে process করে এবং প্রত্যেক row এর against এ value রিটার্ন করে।
OFFSET clause টি optional. এই clause টি ব্যবহার না করলে Default 1 নিয়ে নিবে। offset টি শুন্যের উপরে যে কোন integer ব্যবহার করা যাবে। offset দ্বারা প্রদত্ত row থেকে retrieved row এর দূরত্ব বুঝায়।
যেমন- আমরা employees table এর employee_id, last_name এবং salary দেখব। পাশাপাশি প্রত্যেক employee এর salary এর পাশে প্রত্যেক্ অন্য কোন employee এর salary দেখব যে প্রথম employee এর পূর্বে বা পরে join করেছে। অথবা বর্ণানুক্রিমকভাবে সাজালে যার নাম প্রথম ব্যক্তির আগে বা পরে আসে। যে column এর উপর ভিত্তি করে আগে বা পরে নির্ধারণ হবে তা order_by_clause এ ব্যবহৃত হবে।
DEFAUL clause টি দ্বারা বুঝায় যদি কোন value পাওয়া না যায় তাহলে Default Value প্রদর্শন করবে।
RESPECT/IGNORE NULLS clause টিও optional.
নিচের code টি job_id ‘PU_CLERK’ এর অধীনে থাকা employee এর join date, name এবং salary দেখাবে । পাশাপাশি অন্য column আকারে প্রত্যেক employee এর পাশে অন্য একজন employee এর salary প্রদর্শন করবে যে প্রদত্ত employee এর ১ ডেট পূর্বে যোগদান করেছে।
-----------------------------------------------------------------------------------------------------------------------------------------
SELECT HIRE_DATE, LAST_NAME, SALARY, LAG(SALARY, 1, 0) OVER (ORDER BY HIRE_DATE ) AS PREV_SAL FROM EMPLOYEES
WHERE JOB_ID = 'PU_CLERK'
ORDER BY HIRE_DATE;
এই রেজাল্টে আমরা দেখতে পাচ্ছি,
PU_CLERK এর অধীনে প্রথম জয়ন করা employee এর hire_date 18-MAY-95. তার পূর্বে আর কোন employee জয়ন করেনি। তাই prev_sal তে ০ দেখাচ্ছে । কারন আমরা default clause 0 দিয়েছি। এই job_id এর অধীনে দ্বিতীয় ডেট এ জয়ন করা employee টবিয়াস। তার সেলারি ২৮০০ টাকা। তার পাশের কলামে দেখাচ্ছে ৩১০০ টাকা যা হল এক ডেট আগে জয়ন করা employee খূ এর সেলারি।
-----------------------------------------------------------------------------------------------------------------------------------------
নিচের code টি job_id ‘PU_CLERK’ এর অধীনে থাকা employee এর join date, name এবং salary দেখাবে । পাশাপাশি অন্য column আকারে প্রত্যেক employee এর পাশে অন্য একজন employee এর salary প্রদর্শন করবে যে প্রদত্ত employee এর ১ ডেট পর যোগদান করেছে।
SELECT HIRE_DATE, LAST_NAME, SALARY, LAG(SALARY, 1, 0) OVER (ORDER BY HIRE_DATE DESC) AS PREV_SAL FROM EMPLOYEES
WHERE JOB_ID = 'PU_CLERK'
ORDER BY HIRE_DATE;
------------------------------------------------------------------------------------------------------------------------------------------
নিচর code টি দ্বারা আমরা একটি নির্দিষ্ট job_id (PU_CLERK) এর against এ hire_date, last_name, salary দেখব, পাশাপাশি পাশের কলামে অন্য একজন employee এর last_name দেখব যে এক ডেট আগে জয়ন করেছে এবং আরেকটি কলামে অন্য একজন employee এর salary দেখব যে দুই ডেট আগে জয়ন করেছে।
SELECT HIRE_DATE, LAST_NAME, SALARY,
LAG(LAST_NAME, 1, 0) OVER (ORDER BY HIRE_DATE ) AS PREV_NAME,
LAG(SALARY, 2, 0) OVER (ORDER BY HIRE_DATE ) AS PREV_SAL ,
LAG(DEPARTMENT_ID, 1, 0) OVER (ORDER BY DEPARTMENT_ID, 1, 0) AS PREV_DEPT
FROM EMPLOYEES
WHERE JOB_ID = 'PU_CLERK'
ORDER BY HIRE_DATE;
MORE EXERCISES
1. ORDER BY LAST_NAME
SELECT HIRE_DATE, LAST_NAME, SALARY, LAG(SALARY, 4, 0) OVER (ORDER BY LAST_NAME ) AS PREV_SAL FROM EMPLOYEES
--WHERE JOB_ID = 'PU_CLERK'
ORDER BY LAST_NAME;
2. ORDER BY LAST_NAME desc
SELECT HIRE_DATE, LAST_NAME, SALARY, LAG(SALARY,4, 0) OVER (ORDER BY LAST_NAME DESC ) AS PREV_SAL FROM EMPLOYEES
--WHERE JOB_ID = 'PU_CLERK'
ORDER BY LAST_NAME;
3. ORDER BY DEPARTMENT_ID
SELECT EMPLOYEE_ID, LAST_NAME, SALARY, LAG(SALARY, 2, 0) OVER (ORDER BY department_id) OTHER_SALARY FROM EMPLOYEES
WHERE JOB_ID = 'PU_CLERK';
4. ORDER BY JOB_ID
SELECT EMPLOYEE_ID, LAST_NAME, SALARY, LAG(SALARY, 2, 0) OVER (ORDER BY job_id) OTHER_SALARY FROM EMPLOYEES;
5. PARTITION BY DEPARTMENT_ID ORDER BY JOB_ID
SELECT EMPLOYEE_ID, LAST_NAME, SALARY, LAG(SALARY, 2, 0) OVER (partition by department_id ORDER BY job_id) OTHER_SALARY FROM EMPLOYEES
ORDER BY DEPARTMENT_ID;
SUGGESTIONS ARE WELCOME
PREPARED BY MASUMKHAN/ROUND21
No comments:
Post a Comment