A seven-day MAX and MIN on Tuesdays : Aggregrate Analytical « Analytical Functions « Oracle PL / SQL






A seven-day MAX and MIN on Tuesdays


SQL> -- create demo table
SQL> create table Employee(
  2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
  3    First_Name         VARCHAR2(10 BYTE),
  4    Last_Name          VARCHAR2(10 BYTE),
  5    Start_Date         DATE,
  6    End_Date           DATE,
  7    Salary             Number(8,2),
  8    City               VARCHAR2(10 BYTE),
  9    Description        VARCHAR2(15 BYTE)
 10  )
 11  /

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2               values ('01','Jason',    'Martin',  to_date('19960725','YYYYMMDD'), to_date('20060725','YYYYMMDD'), 1234.56, 'Toronto',  'Programmer')
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values('02','Alison',   'Mathews', to_date('19760321','YYYYMMDD'), to_date('19860221','YYYYMMDD'), 6661.78, 'Vancouver','Tester')
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values('03','James',    'Smith',   to_date('19781212','YYYYMMDD'), to_date('19900315','YYYYMMDD'), 6544.78, 'Vancouver','Tester')
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values('04','Celia',    'Rice',    to_date('19821024','YYYYMMDD'), to_date('19990421','YYYYMMDD'), 2344.78, 'Vancouver','Manager')
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values('05','Robert',   'Black',   to_date('19840115','YYYYMMDD'), to_date('19980808','YYYYMMDD'), 2334.78, 'Vancouver','Tester')
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values('06','Linda',    'Green',   to_date('19870730','YYYYMMDD'), to_date('19960104','YYYYMMDD'), 4322.78,'New York',  'Tester')
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values('07','David',    'Larry',   to_date('19901231','YYYYMMDD'), to_date('19980212','YYYYMMDD'), 7897.78,'New York',  'Manager')
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values('08','James',    'Cat',     to_date('19960917','YYYYMMDD'), to_date('20020415','YYYYMMDD'), 1232.78,'Vancouver', 'Tester')
  3  /

1 row created.

SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
  2  /

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester

8 rows selected.

SQL>
SQL>
SQL>
SQL>
SQL> -- A seven-day MAX and MIN on Tuesdays:
SQL>
SQL> SELECT 'Tuesday, '||TO_CHAR(x.start_date,'Month dd,yyyy') "Tuesdays",
  2    x.minp "Minimum salary", x.maxp "Maximum salary"
  3  FROM
  4    (SELECT i.start_date, i.salary,
  5       MIN(i.salary) OVER( ORDER BY i.start_date
  6         RANGE BETWEEN INTERVAL '7' day PRECEDING
  7      AND CURRENT ROW) minp,
  8       MAX(i.salary) OVER( ORDER BY i.start_date
  9         RANGE BETWEEN INTERVAL '7' day PRECEDING
 10      AND CURRENT ROW) maxp
 11    FROM employee i
 12    ORDER BY i.start_date) x
 13  WHERE x.start_date in
 14    (SELECT z.start_date -- , NEXT_DAY(z.start_date-1,'Tuesday')
 15      FROM employee z
 16      WHERE z.start_date = NEXT_DAY(z.start_date-1,'Tuesday'));

Tuesdays                   Minimum salary Maximum salary
-------------------------- -------------- --------------
Tuesday, December  12,1978        6544.78        6544.78
Tuesday, September 17,1996        1232.78        1232.78

SQL>
SQL>
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
  2  /

Table dropped.

SQL>
SQL>

           
       








Related examples in the same category

1.count(*) over partition, order by, range unbounded preceding
2.count(*) over partition by, order by, range unbounded preceding
3.Employee salary report with avg salary for the previous 12 months
4.avg over range between
5.Is our average total_order_price increasing or decreasing?
6.analytic order-by clause
7.avg over and avg over order by
8.Sum over order by
9.Sum over partition by and order by
10.avg over order by range
11.average 5 before, after
12.Row-ordering is done first and then the moving average
13.Avg over ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
14.SUM(y) OVER(ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
15.Use the COUNT aggregate analytical function to show how many rows are included in each window
16.To see how the moving average window can expand
17.Uses dates and logical offset of seven days preceding
18.A seven-day MAX and MIN on Tuesdays: using TO_CHAR function
19.Displaying a Running Total Using SUM as an Analytical Function
20.Reporting on a Sum