Professional Documents
Culture Documents
Windowing Clause Unbounding PDF
Windowing Clause Unbounding PDF
WINDOWING CLAUSE
Session 740
Dan Stober
Tuesday, April 24, 2012
Dan Stober
• Data Architect – Intermountain Healthcare
• Attended California State Univ., Fresno
• Working in Oracle databases since 2001
• Frequent presenter at local and national user group conferences
• Oracle Open World - twice
• Private Instructor for Trutek
• Teaching PLSQL
• Oracle Certified SQL Expert
• Board of Trustees – Utah Oracle Users Group (UTOUG)
• Edit newsletter
• Write SQL Tip column
Dan Stober – Personal Stuff
• Married for twenty years with two kids
• Run two marathons
• Next one in four weeks
• Three Ragnars
• Enjoy
• Photography
• Travel
Intermountain Healthcare
• 23 hospitals in Utah and Idaho
• Non-profit integrated health care system
• 750 Employed physicians
• 32,000 employees
• The largest non-government employer in Utah
• One of the largest and most complete clinical data warehouses in the
world!
Session Norms
• Questions?
• Interrupt Me!
• I learn something from every session I do!
• Set the record straight!
• Cell phones?
• OK!
Shameless Plug
• UTOUG Fall Symposium
• Thursday, September 6
• Salt Lake City
• Call For Presentations is open!
• Deadline: June 15
• All things Oracle: DBA, Development, APEX, EBS, Business
Intelligence
Agenda
• Aggregate vs Analytic
• PARTITION BY
• ORDER BY
• Window Clause
•ROWS
•RANGE
WHY USE ANALYTIC FUNCTIONS?
COUNT ; ;
SUM ; ;
MAX ; ;
MIN ; ;
Analytic OVER ( some other stuff) Does not change number of rows
AGGREGATE
EXAMPLES Deptno Ename Sal
SELECT COUNT ( * ) 10 Clark 2450
FROM scott.emp;
10 King 5000
COUNT(*)
---------- 10 Miller 1300
14 SELECT COUNT ( * )
, SUM ( sal ) 20 Adams 1100
1 row selected. , MAX ( sal )
20 Ford 3000
, MIN ( ename )
FROM scott.emp; 20 Jones 2975
SELECT SUM ( sal ) COUNT(*) SUM(SAL) MAX(SAL) MIN(ENAME) 20 Scott 3000
FROM scott.emp; ---------- ---------- ---------- ----------
14 29025 5000 ADAMS 20 Smith 800
SUM(SAL)
---------- 30 Allen 1600
29025 1 row selected.
30 Blake 2850
14 rows selected.
HERE’S THE
SAME QUERY
SELECT deptno, ename, sal, job
,( SELECT COUNT ( * ) FROM scott.emp WHERE job = e.job ) jobcount
Using aggregate ,( SELECT SUM ( sal ) FROM scott.emp WHERE deptno = e.deptno ) deptsum
FROM scott.emp e;
functions in the DEPTNO ENAME SAL JOB JOBCOUNT DEPTSUM
traditional manner ------- -------- ------- --------- ---------- ----------
10 CLARK 2450 MANAGER 3 8750
10 KING 5000 PRESIDENT 1 8750
10 MILLER 1300 CLERK 4 8750
Correlated 20 ADAMS 1100 CLERK 4 10875
scalar 20 FORD 3000 ANALYST 2 10875
20 JONES 2975 MANAGER 3 10875
subqueries 20 SCOTT 3000 ANALYST 2 10875
20 SMITH 800 CLERK 4 10875
30 ALLEN 1600 SALESMAN 4 9400
Same Results as 30 BLAKE 2850 MANAGER 3 9400
30 JAMES 950 CLERK 4 9400
prior slide 30 MARTIN 1250 SALESMAN 4 9400
30 TURNER 1500 SALESMAN 4 9400
30 WARD 1250 SALESMAN 4 9400
14 rows selected.
EXPLAIN
PLAN
Traditional
PLAN_TABLE_OUTPUT
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------- aggregate
---------------------------------------------------------------------------
Plan hash value: 1174980467
Plan hash value: 1174980467 syntax.
---------------------------------------------------------------------------
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
Three passes
|
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
---------------------------------------------------------------------------
over the table
| 0 | SELECT STATEMENT | | 14 | 294 | 3 (0)| 00:00:01 |
| 0 | SELECT STATEMENT | | 14 | 294 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 8 | | |
| 1 | SORT AGGREGATE | | 1 | 8 | | |
|* 2 | TABLE ACCESS FULL| EMP | 3 | 24 | 3 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| PLAN_TABLE_OUTPUT
EMP | 3 | 24 | 3 (0)| 00:00:01 |
|
|
3 | SORT AGGREGATE
3 | SORT AGGREGATE
| | 1 |
PLAN_TABLE_OUTPUT 7 | | |Analytic SQL.
|----------------------------------------------------------------------------
| 1 | 7 | | |
|* 4 | TABLE ACCESS FULL| EMP | 5 | 35 | 3 (0)| 00:00:01 |
|
|* 4 | TABLE ACCESS FULL|Plan
EMP hash
5 | TABLE ACCESS FULL | EMP |
| 5 |
value:
14 |
35 |
4086863039
294 | 3
3 (0)| 00:00:01
(0)| 00:00:01 | ONE PASS!
----------------------------------------------------------------------------
|
| 5 | TABLE ACCESS FULL | Plan
EMP hash| value:
14 | 4086863039
294 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
---------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
| Id by
Predicate Information (identified | Operation
operation id): | Name | Rows | Bytes | Cost (%CPU)| Time |
| Id by
Predicate Information (identified | Operation
operation id): | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
---------------------------------------------------
----------------------------------------------------------------------------
---------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 294 | 5 (40)| 00:00:01 |
| 0 | SELECT STATEMENT | | 14 | 294 | 5 (40)| 00:00:01 |
2 - filter("JOB"=:B1) | 1 | WINDOW SORT | | 14 | 294 | 5 (40)| 00:00:01 |
2 - filter("JOB"=:B1) | 1 | WINDOW SORT | | 14 | 294 | 5 (40)| 00:00:01 |
4 - filter("DEPTNO"=:B1) | 2 | WINDOW SORT | | 14 | 294 | 5 (40)| 00:00:01 |
4 - filter("DEPTNO"=:B1) | | 2 | WINDOW SORT | | 14 | 294 | 5 (40)| 00:00:01 |
3 | TABLE ACCESS FULL| EMP | 14 | 294 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP | 14 | 294 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
----------------------------------------------------------------------------
TWO NEW
FUNCTIONS
• LAG
• LEAD
• Usage:
• LAG ( field_name, num_recs ) OVER ( )
• Return the value from a field when looking one record (or more)
behind/ahead
• Using the order specified
• ORDER BY is required
• Does not have to be order used in the query
• Optional second param to look more than one record
• These functions are analytic only
LAG
DEMONSTRATION ENAME HIREDATE
SELECT deptno, ename, hiredate
, LAG ( ename ) OVER ( ORDER BY hiredate ) prior_hire ADAMS 1/12/1983
FROM scott.emp
ORDER BY deptno, ename; 2 ALLEN 2/20/1981
DEPTNO ENAME HIREDATE PRIOR_HIRE BLAKE 5/1/1981
DEPTNO ENAME HIREDATE PRIOR_HIRE
---------- ---------- --------- ----------
---------- ---------- --------- ---------- CLARK 6/9/1981
10 CLARK 09-JUN-81 BLAKE
10 CLARK 09-JUN-81 BLAKE
10 KING 17-NOV-81 MARTIN FORD 12/3/1981
10 KING 17-NOV-81 MARTIN
10 MILLER 23-JAN-82 FORD
10 MILLER 23-JAN-82 FORD JAMES 12/3/1981
20 ADAMS 23-MAY-87 SCOTT
20 ADAMS 23-MAY-87 SCOTT
20 FORD 03-DEC-81 JAMES JONES 4/02/1981
20 FORD 03-DEC-81 JAMES
20 JONES 02-APR-81 WARD
20 JONES 02-APR-81 WARD KING 11/17/1981
20 SCOTT 09-DEC-82 MILLER
20 SCOTT 09-DEC-82 MILLER
20 SMITH 17-DEC-80 MARTIN 9/28/1981
20 SMITH 17-DEC-80
30 ALLEN 20-FEB-81 SMITH
30 ALLEN 20-FEB-81 SMITH MILLER 1/23/1982
30 BLAKE 01-MAY-81 JONES
30 BLAKE 01-MAY-81 JONES
30 JAMES 03-DEC-81 KING SCOTT 12/9/1982
30 JAMES 03-DEC-81 KING
30 MARTIN 28-SEP-81 TURNER
30 MARTIN 28-SEP-81 TURNER 1 SMITH 12/17/1980
30 TURNER 08-SEP-81 CLARK
30 TURNER 08-SEP-81 CLARK
30 WARD 22-FEB-81 ALLEN TURNER 9/08/1981
30 WARD 22-FEB-81 ALLEN
14 rows selected.
14 rows selected
3 WARD 2/22/1981
ORDER BY
VARIATION
SELECT deptno, ename, sal ENAME
, LAG ( ename ) OVER ( ORDER BY ename ) f1 ADAMS
, LAG ( ename , 2 ) OVER ( ORDER BY ename ) f2
, LEAD ( ename ) OVER ( ORDER BY ename DESC) f3 ALLEN
, LAG ( sal ) OVER ( ORDER BY ename ) f4
BLAKE
FROM scott.emp
ORDER BY deptno, ename; CLARK
DEPTNO ENAME SAL F1 F2 F3 F4
DEPTNO----------
---------- ENAME SAL----------
---------- F1 F2
---------- F3
---------- F4
----------
FORD
---------- ----------
10 CLARK ---------- ----------
2450 BLAKE ----------
ALLEN ----------
BLAKE ----------
2850
10KING
CLARK 2450JONES
BLAKE ALLEN BLAKE 2850 JAMES
10 5000 JAMES JONES 2975
10 KING
10 MILLER 5000 JONES
1300 MARTIN JAMES
KING JONES
MARTIN 2975
1250
10 MILLER 1300 MARTIN KING MARTIN 1250
JONES
20 ADAMS 1100
20 ADAMS
20 FORD 1100
3000 CLARK BLAKE CLARK 2450 KING
20JONES
20 FORD 3000JAMES
2975 CLARK BLAKE
FORD CLARK
JAMES 2450
950
20 JONES
20 SCOTT 2975 JAMES
3000 MILLER FORD
MARTIN JAMES
MILLER 950
1300 MARTIN
20 SCOTT
20 SMITH 3000 MILLER
800 SCOTT MARTIN
MILLER MILLER
SCOTT 1300
3000
20ALLEN
30 SMITH 800ADAMS
1600 SCOTT MILLER SCOTT
ADAMS 3000
1100 MILLER
30 ALLEN
30 BLAKE 1600 ADAMS
2850 ALLEN ADAMS ADAMS
ALLEN 1100
1600
30 BLAKE 2850 ALLEN ADAMS ALLEN 1600 SCOTT
30 JAMES 950 FORD CLARK FORD 3000
30 JAMES
30 MARTIN 950 FORD
1250 KING CLARK
JONES FORD
KING 3000
5000
30 MARTIN 1250 KING JONES KING 5000 SMITH
30 TURNER 1500 SMITH SCOTT SMITH 800
30 TURNER
30 WARD 1500 SMITH
1250 TURNER SCOTT
SMITH SMITH
TURNER 800
1500
30 WARD 1250 TURNER SMITH TURNER 1500
TURNER
14 rows selected. WARD
14 rows selected.
ORDER BY WITH
PARTITION BY Deptno Ename Sal
SELECT deptno, ename, sal
10 Clark 2450
, LAG ( ename ) OVER ( ORDER BY ename ) f1
, LAG ( ename ) OVER ( PARTITION BY deptno ORDER BY ename ) f2 10 King 5000
, LAG ( ename ) OVER ( PARTITION BY deptno ORDER BY sal DESC) f3
FROM scott.emp 10 Miller 1300
ORDER BY deptno, ename; 20 Adams 1100
DEPTNO ENAME SAL F1 F2 F3
DEPTNO ENAME SAL F1 F2 F3 20 Ford 3000
-------- ---------- -------- ---------- ---------- -------
-------- ---------- --------
10 CLARK ---------- ----------KING
2450 BLAKE -------
10 CLARK 2450 BLAKE KING 20 Jones 2975
10 KING 5000 JONES CLARK
10MILLER
KING 5000MARTIN
JONES CLARK
10 1300 KING CLARK 20 Scott 3000
10 MILLER
20 ADAMS 1300
1100 MARTIN KING CLARK
JONES
20 ADAMS
20 FORD 1100
3000 CLARK ADAMS JONES
SCOTT 20 Smith 800
20 FORD
20 JONES 3000 CLARK
2975 JAMES ADAMS
FORD SCOTT
FORD
20 JONES
20 SCOTT 2975 JAMES
3000 MILLER FORD
JONES FORD 30 Allen 1600
20 SCOTT
20 SMITH 3000 MILLER
800 SCOTT JONES
SCOTT ADAMS
20ALLEN
30 SMITH 800ADAMS
1600 SCOTT SCOTT ADAMS
BLAKE
30 Blake 2850
30 ALLEN
30 BLAKE 1600 ADAMS
2850 ALLEN ALLEN BLAKE
30 BLAKE 2850 ALLEN ALLEN 30 James 950
30 JAMES 950 FORD BLAKE WARD
30MARTIN
30 JAMES 950KING
1250 FORD BLAKE
JAMES WARD
TURNER
30 MARTIN 1250 KING JAMES TURNER 30 Martin 1250
30 TURNER 1500 SMITH MARTIN ALLEN
30 TURNER
30 WARD 1500 SMITH
1250 TURNER MARTIN
TURNER ALLEN
MARTIN 30 Turner 1500
30 WARD 1250 TURNER TURNER MARTIN
14 rows selected. 30 Ward 1250
14 rows selected.
ORDER OF ITEMS IN
ANALYTIC CLAUSE
SELECT deptno, empno, ename, sal
, MIN ( sal ) OVER ( ORDER BY ename PARTITION BY deptno ) minsal
FROM scott.emp; Components
, MIN ( sal ) OVER ( ORDER BY ename PARTITION BY deptno ) minsal
, MIN ( sal ) OVER ( ORDER BY ename PARTITION BY deptno ) minsal
*
must be in
*
ERROR at line 2:
ERROR at line 2:
ORA-00907: missing right parenthesis
correct order
ORA-00907: missing right parenthesis
1 11,000 11,000
2 15,000 26,000 SUM ( sales ) OVER
3 12,000 38,000 (ORDER BY week_number)
4 16,000 54,000
DEFAULT
WINDOWING
... OVER ( PARTITION BY cust )
4
DEFAULT
WINDOWING
... OVER
... OVER ( PARTITION
( PARTITION BY cust
BY cust )
ORDER BY order_date )
Cust Order_Date
Calculation on each of COUNT ( * )
A 12/25/2010 these records includes OVER ...
A 1/15/2011 only the records which COUNT COUNT
A 2/28/2011 preceded it in the partition 3 1
B 6/16/2010 3
Calculation on each of 2
B 9/15/2010
these records includes 3 3
B 1/1/2011 only the records which 4
1
B 2/12/2011 preceded it in the partition 4
2
4
3
4
4
WINDOWING
• Demonstration of default windowing
• With and without ORDER BY SUM 1 is the same as SUM3
SELECT deptno, ename, sal
, SUM ( sal ) OVER ( ) sum1 SUM 2 is the same as SUM4
, SUM ( sal ) OVER ( ORDER BY ename ) sum2
, SUM ( sal ) OVER ( ORDER BY ename
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) sum3
Default
, SUM ( sal ) OVER ( ORDER BY ename windowing
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) sum4
FROM scott.emp saves a lot
WHERE deptno = 10;
of typing
DEPTNO ENAME SAL SUM1 SUM2 SUM3 SUM4
DEPTNO ENAME SAL SUM1 SUM2 SUM3 SUM4
---------- ---------- ---------- ---------- ---------- ---------- ----------
and
---------- ---------- ---------- ---------- ---------- ---------- ----------
10 CLARK
10 CLARK
2450
2450
8750
8750
2450
2450
8750
8750
2450
2450 eliminates
10 KING 5000 8750 7450 8750 7450
10 KING
10 MILLER
10 MILLER
5000
1300
1300
8750
8750
8750
7450
8750
8750
8750
8750
8750
7450
8750
8750
clutter
3 rows selected.
3 rows selected
WINDOWING
SELECT deptno, ename, sal
, SUM ( sal ) OVER ( ORDER BY ename • Selects a smaller subset than the
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) sum1 partition
, SUM ( sal ) OVER (
ROWS BETWEEN 1
PARTITION BY deptno ORDER BY ename
PRECEDING AND 1 FOLLOWING ) sum2
• Based on a number of records
FROM scott.emp;
before/after
DEPTNO ENAME SAL SUM1 SUM2
• Or a time period before/after
DEPTNO----------
---------- ENAME SAL----------
---------- SUM1----------
SUM2
---------- ---------- ---------- ---------- ----------
10 CLARK
10KING
10 CLARK
2450
2450
5000
8300
8300
9225
7450
7450
8750
2450+5000
10 KING
10 MILLER 5000
1300 9225
5550 8750
6300
10
20
MILLER
20 ADAMS
ADAMS
1300
1100
1100
5550
2700
2700
6300
4100
4100
2450+5000+1300
20 FORD 3000 6400 7075
20 FORD 3000 6400 7075
20 JONES
20 JONES
20 SCOTT
2975
2975
3000
8925
8925
5100
8975
8975
6775
5000+1300
20 SCOTT
20 SMITH 3000
800 5100
5300 6775
3800
20
30
SMITH
30 ALLEN
ALLEN
800
1600
1600
5300
5550
5550
3800
4450
4450
1100+3000
30 BLAKE 2850 6900 5400
30 BLAKE 2850 6900 5400
30 JAMES
30 JAMES
30 MARTIN
950
950
1250
6925
6925
7550
5050
5050
3700
1100+3000+2975
30 MARTIN
30 TURNER 1250
1500 7550
3550 3700
4000
30 TURNER
30 WARD 1500
1250 3550
2750 4000
2750
30 WARD 1250 2750 2750
14 rows selected.
14 rows selected.
SYNTAX DIAGRAM
SOURCE:
Oracle Database SQL Language Reference
11g Release 2 (E10592-04)
Page 5-12
WINDOWING CLAUSE
COMPARISON
Row windowing:
Restricts window by records Analytic function will
Based on ORDER BY include the 10 records
just before this record
ROWS BETWEEN 10 PRECEDING and the 10 records
after
AND 10 FOLLOWING
Analytic function will
Range windowing: include all records
Restricts window by a period of time or a value within 10 days of the
References field used in ORDER BY record in question
INTERVAL 3 DAY
SOURCE:
Oracle Database SQL Language Reference
11g Release 2 (E10592-04)
Page 5-12
Shortcut
• If…
• You omit BETWEEN and AND
• And the windowing value is <= CURRENT ROW
• Then…
• The second argument is assumed to be CURRENT ROW
DAN STOBER
Questions? Comments?
dan.stober@utoug.org
Twitter: @dstober
Slides available on slideshare.net