-- Test: TEST063 (Executor)
-- @@@ START COPYRIGHT @@@
--
-- Licensed to the Apache Software Foundation (ASF) under one
-- or more contributor license agreements.  See the NOTICE file
-- distributed with this work for additional information
-- regarding copyright ownership.  The ASF licenses this file
-- to you under the Apache License, Version 2.0 (the
-- "License"); you may not use this file except in compliance
-- with the License.  You may obtain a copy of the License at
--
--   http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing,
-- software distributed under the License is distributed on an
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-- KIND, either express or implied.  See the License for the
-- specific language governing permissions and limitations
-- under the License.
--
-- @@@ END COPYRIGHT @@@
--
-- Functionality: Sequencing functions, including running count, sum,
--                average, min, max, standard deviation, diffs, etc,
--                on small int, int, large int, date, and char datatypes.
-- Expected files: EXPECTED063 - Windows expected files
--                 EXPECTED063.MX - MX tables expected files, floating number
--                                  precision differences
--                 EXPECTED063.MP - MP tables expected files, view related
--                                  tests excluded.
-- Known diff files: DIFF063.KNOWN - Precision difference, cause unknown
-- Table created: t063t1, t063t2, t063t3
-- View created: v063v1
-- Limitations:
-- To do: Eliminate EXPECTED063.MX file when IEEE float number is supported.
-- Revision history:
--     (3/28/02) - Copied from fullstack/TEST063
--     (11/22/02) - Merged from R1.8: testing on moving windows and PCODE
--                  level changes

--
-- Need to add CONTROL QUERY test
--

-- some rank() tests yield different results when robust_query_optimization 
-- is set to system. Specifically, 
--select rank() over (partition by sex order by paygrade,num) r from olap_empo;
-- returns unordered results because of a parallel plan. Until we can resolve
-- this issue, let's run test063 using robust_query_optimization minimum
control query default robust_query_optimization 'minimum';

?section cleanup
#ifMX
drop view t063v1;
#ifMX
drop table t063t1;
drop table t063t2;
drop table t063t3;
control query default risk_premium_serial '1.0';
log LOG063 clear;
?section crtab
CREATE TABLE t063t1 
(a smallint, b int, c int, d date, e char(8), g char(2));

insert into t063t1 values
( 1,10,110, DATE '1980-11-03','A STRING','G1'),
( 2,18,112, DATE '1980-12-03','B STRING','G2'),
( 3,27,116, DATE '1981-01-03','C STRING','G3'),
( 4,35,122, DATE '1981-02-03','D STRING','G4'),
( 5,45,130, DATE '1981-03-03','E STRING','G5'),
( 6,30,140, DATE '1981-04-03','F STRING','G1'),
( 7,35,152, DATE '1981-05-03','G STRING','G2'),
( 8,40,166, DATE '1981-06-03','H STRING','G3'),
( 9,45,182, DATE '1981-07-03','I STRING','G4'),
(10,22,110, DATE '1981-08-03','J STRING','G5'),
(11,26,112, DATE '1981-09-03','K STRING','G1'),
(12,30,116, DATE '1981-10-03','L STRING','G2'),
(13,35,122, DATE '1981-11-03','M STRING','G3'),
(14,38,130, DATE '1981-12-03','N STRING','G4'),
(15,45,140, DATE '1982-01-03','O STRING','G5'),
(16,23,152, DATE '1982-02-03','P STRING','G1'),
(17,25,166, DATE '1982-03-03','Q STRING','G2'),
(18,27,182, DATE '1982-04-03','R STRING','G3'),
(19,29,200, DATE '1982-05-03','S STRING','G4'),
(20,22,112, DATE '1982-06-03','T STRING','G5'),
(21,24,116, DATE '1982-07-03','U STRING','G1'),
(22,26,122, DATE '1982-08-03','V STRING','G2'),
(23,28,130, DATE '1982-09-03','W STRING','G3'),
(24,30,140, DATE '1982-10-03','X STRING','G4'),
(25,32,152, DATE '1982-11-03','Y STRING','G5');


?section seltab
SELECT RUNNINGCOUNT(*) FROM t063t1 SEQUENCE BY A;

SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGCOUNT(*), (SELECT COUNT(*) FROM t063t1 WHERE a <= T1.a)
FROM t063t1 T1
SEQUENCE BY A) T2(v,ev)) T3(status)
GROUP BY status;

SELECT RUNNINGCOUNT(D) FROM t063t1 SEQUENCE BY A;
 

SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGCOUNT(D), (SELECT COUNT(D) FROM t063t1 WHERE a <= T1.a)
FROM t063t1 T1
SEQUENCE BY A) T2(v,ev)) T3(status)
GROUP BY status;

SELECT RUNNINGMAX(D) FROM t063t1 SEQUENCE BY A;

SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGMAX(D), (SELECT MAX(D) FROM t063t1 WHERE a <= T1.a)
FROM t063t1 T1
SEQUENCE BY A) T2(v,ev)) T3(status)
GROUP BY status;

SELECT RUNNINGMIN(D) FROM t063t1 SEQUENCE BY A;

SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGMIN(D), (SELECT MIN(D) FROM t063t1 WHERE a <= T1.a)
FROM t063t1 T1
SEQUENCE BY A) T2(v,ev)) T3(status)
GROUP BY status;

SELECT RUNNINGSUM(C) FROM t063t1 SEQUENCE BY A;

--- Is semantically equivalent to:

SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGSUM(C), (SELECT SUM(C) FROM t063t1 WHERE a <= T1.a)
FROM t063t1 T1
SEQUENCE BY A) T2(v,ev)) T3(status)
GROUP BY status;

SELECT RUNNINGAVG(C) FROM t063t1 SEQUENCE BY A;

SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGAVG(C), (SELECT AVG(C) FROM t063t1 WHERE a <= T1.a)
FROM t063t1 T1
SEQUENCE BY A) T2(v,ev)) T3(status)
GROUP BY status;

SELECT RUNNINGVARIANCE(C) FROM t063t1 SEQUENCE BY A;

SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGVARIANCE(C), (SELECT VARIANCE(C) FROM t063t1 WHERE a <= T1.a)
FROM t063t1 T1
SEQUENCE BY A) T2(v,ev)) T3(status)
GROUP BY status;
 
SELECT RUNNINGSTDDEV(C) FROM t063t1 SEQUENCE BY A;
 
SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGSTDDEV(C), (SELECT STDDEV(C) FROM t063t1 WHERE a <= T1.a)
FROM t063t1 T1
SEQUENCE BY A) T2(v,ev)) T3(status)
GROUP BY status;

SELECT RUNNINGRANK(C) FROM t063t1 SEQUENCE BY C;
 
SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT RUNNINGRANK(C), (SELECT case when sum(cnt) is null 
                                     then 0
                                     else sum(cnt) end + 1 
                         FROM (select c, cast(count(*) as integer) cnt
                               from t063t1 WHERE c < T1.c group by c) G) 
FROM t063t1 T1
SEQUENCE BY C) T2(v,ev)) T3(status)
GROUP BY status;

SELECT C, ROWS SINCE CHANGED (C) FROM t063t1 SEQUENCE BY C;
SELECT C, D, ROWS SINCE CHANGED (C,D) FROM t063t1 SEQUENCE BY C,D;

SELECT status, count(*)
FROM
(SELECT CASE WHEN v = ev THEN 'PASS' ELSE 'FAIL' END
FROM
(SELECT ROWS SINCE CHANGED(C), 
        ROWS SINCE INCLUSIVE ((C <> offset(C,1)) OR (offset(C,1) is NULL)) + 1
FROM t063t1 T1
SEQUENCE BY C) T2(v,ev)) T3(status)
GROUP BY status;

-- Correlated Subquery 

SELECT a, RUNNINGMAX(b), (SELECT MAX(B) from t063t1 where (a <= S.a)) from t063t1 S SEQUENCE BY A;

SELECT a, (SELECT SUM(B) from t063t1 where (a <= S.a)), y  
FROM t063t1 S, (SELECT a, RUNNINGSUM(B) from t063t1 sequence by a) AS T(x, y) 
where a = x;

-- MOVINGMIN/MOVINGMAX

SELECT a, MOVINGMIN(b, 5), (SELECT MIN(B) from t063t1 where (a between S.a-4 and S.a)) from  t063t1 S SEQUENCE BY A;
SELECT a, MOVINGMAX(c, 5), (SELECT MAX(C) from t063t1 where (a between S.a-4 and S.a)) from  t063t1 S SEQUENCE BY A;

-- Test semantic equivalences and DIFFs of Date-Time values

SELECT DIFF1(B), B-OFFSET(B, 1)  FROM t063t1 SEQUENCE BY A;
SELECT DIFF2(B), DIFF1(B)-OFFSET(DIFF1(B), 1)  FROM t063t1 SEQUENCE BY A;
SELECT DIFF1(B,D) FROM t063t1 SEQUENCE BY A;
SELECT DIFF1(B,D), DIFF1(B)/CAST(DIFF1(D) AS LARGEINT) FROM t063t1 SEQUENCE BY A;
SELECT DIFF2(B,D), DIFF2(B)/CAST(DIFF1(D) AS LARGEINT) FROM t063t1 SEQUENCE BY A;

?section negtests
-- Negative Tests
-- should return error 4108
SELECT a, c, runningavg(c), rows since (this (c) > runningavg(this(c))) from t063t1 sequence by a ;

-- should return error 4109
SELECT a, b, RUNNINGAVG(c) from t063t1 WHERE a > 5 and RUNNINGAVG(c) > 130 sequence by a;

-- should return 4110
SELECT a, b, RUNNINGAVG(c) from t063t1 WHERE a > 5;

-- should return 4111
select a, b, c from t063t1 sequence by a;

--
-- Invalid arguments:
--
-- first argument invalid
select runningsum(d) from t063t1 sequence by a;
select runningavg(d) from t063t1 sequence by a;
select movingsum(d, 5) from t063t1 sequence by a;
select movingavg(d, 5) from t063t1 sequence by a;
select runningsum(e) from t063t1 sequence by a;
select runningavg(e) from t063t1 sequence by a;
select movingsum(e, 5) from t063t1 sequence by a;
select movingavg(e, 5) from t063t1 sequence by a;

-- second argument invalid
select movingsum(5, d) from t063t1 sequence by a;
select movingavg(5, d) from t063t1 sequence by a;

select movingsum(5, e) from t063t1 sequence by a;
select movingavg(5, e) from t063t1 sequence by a;

-- first argument invalid
select diff1(e) from t063t1 sequence by a;
select diff2(e) from t063t1 sequence by a;
select diff1(e,c) from t063t1 sequence by a;
select diff2(e,c) from t063t1 sequence by a;

--second argument invalid
select diff1(c, e) from t063t1 sequence by a;
select diff2(c, e) from t063t1 sequence by a;

?section derived
-- Derived tables

-- should get right answer
SELECT aa, bb, cc 
FROM (SELECT a, b, RUNNINGAVG(c) from t063t1 WHERE a > 5 sequence by a) AS T(aa,bb,cc)
WHERE cc > 130;

SELECT g, AVG(c) FROM t063t1 GROUP BY g;

SELECT gg, MOVINGSUM (avgC,2) as MSUM 
FROM (SELECT g, AVG(c) FROM t063t1 GROUP BY g) AS T2 (gg, avgC) 
SEQUENCE BY gg;

?section scalar_agg
-- 
-- The following all return NO rows from the sequence node
--
SELECT MAX(MMM)
FROM
(SELECT MOVINGSUM (avgC,2) as MSUM 
FROM (SELECT g, AVG(c) FROM t063t1 GROUP BY g) AS T2 (gg, avgC) 
SEQUENCE BY gg) as T3 (MMM);

SELECT COUNT(MMM)
FROM
(SELECT MOVINGSUM (avgC,2) as MSUM 
FROM (SELECT g, AVG(c) FROM t063t1 GROUP BY g) AS T2 (gg, avgC) 
SEQUENCE BY gg) as T3 (MMM);

SELECT COUNT(*)
FROM
(SELECT MOVINGSUM (avgC,2) as MSUM 
FROM (SELECT g, AVG(c) FROM t063t1 GROUP BY g) AS T2 (gg, avgC) 
SEQUENCE BY gg) as T3 (MMM);

SELECT COUNT(*)
FROM (SELECT g, AVG(c) FROM t063t1 GROUP BY g) AS T;

SELECT COUNT(MMM)
FROM
(SELECT MOVINGSUM (c,2) as MSUM FROM t063t1 sequence by a) as T (MMM);

SELECT AVG(MOVINGSUM (c,2)) ASUM FROM t063t1 sequence by a;

-- 
-- Derived Table
--
SELECT aa,  cast(bb as numeric(7,2)), cast (cc as numeric (7,2)) FROM 
(SELECT a, RUNNINGSUM(B), MOVINGAVG(C,5) FROM t063t1 sequence by a) AS T (aa,bb,cc);

-- CREATE VIEW
#ifMX
CREATE VIEW t063v1 (x, y, z) as 
SELECT a, CAST (RUNNINGSUM(B) AS NUMERIC(7,2)), CAST (MOVINGAVG(C,5) AS NUMERIC(7,2)) FROM t063t1 sequence by a;

SELECT * from t063v1;

--
-- Correctly avoids pushing predicate down 
--
SELECT * from t063v1 where x = 10;

--
--
SELECT aa,  x, cast(bb as numeric(7,2)), cast (cc as numeric (7,2)) FROM 
(SELECT a, RUNNINGSUM(B), MOVINGAVG(C,5) FROM t063t1 sequence by a) AS T (aa,bb,cc), t063v1 where aa = x;

--
--
SELECT aa,  x, cast(bb as numeric(7,2)), y, cast (cc as numeric (7,2)) FROM 
(SELECT a, RUNNINGSUM(B), MOVINGAVG(C,5) FROM t063t1 sequence by a) AS T (aa,bb,cc), t063v1 where aa = x;


SELECT aa,  x, cast(bb as numeric(7,2)), cast (cc as numeric (7,2)), z FROM 
(SELECT a, RUNNINGSUM(B), MOVINGAVG(C,5) FROM t063t1 sequence by a) AS T (aa,bb,cc), t063v1 where aa = x;
#ifMX

-- 
?section rows_since
-- ROWS SINCE

SELECT a, c, runningavg(c), rows since (this (c) > runningavg(c)) FROM t063t1 sequence by a;
SELECT a, c, runningavg(c), rows since inclusive(this (c) > runningavg(c)) FROM t063t1 sequence by a;

select a, b, ROWS SINCE (a > b),  ROWS SINCE INCLUSIVE (a > b) FROM
(select aa, bb from (values(1)) as T(a) transpose 
(2 , 3),
(4 , 5),
(1 , 6),
(8 , 12),
(10, 12),
(12, 15) as (aa,bb)) as T (a, b) sequence by a;

select a, b, ROWS SINCE (a < b),  ROWS SINCE INCLUSIVE (a < b) FROM
(select aa, bb from (values(1)) as T(a) transpose 
(2 , 3),
(4 , 5),
(1 , 6),
(8 , 12),
(10, 12),
(12, 15) as (aa,bb)) as T (a, b) sequence by a;

-- LAST NOT NULL

select a, b, RUNNINGCOUNT(b) as RCOUNT, RUNNINGAVG (b) as RAVG, LASTNOTNULL(b) as LASTNN, RANK(a) RANK FROM
(select aa, bb from (values(1)) as T(a) transpose 
(1, 3),
(2, 5),
(3, 6),
(4, NULL),
(5, NULL),
(6, 14),
(7, NULL),
(8, NULL),
(9, 15)
as (aa,bb)) as T (a, b) sequence by a;

select b, MOVINGCOUNT(*,3) as MCOUNTSTAR, MOVINGCOUNT(b,3) as MCOUNT, MOVINGAVG (b,3) as MAVG FROM
(select aa, bb from (values(1)) as T(a) transpose 
(1, 3),
(2, 5),
(3, 6),
(4, NULL),
(5, NULL),
(6, 14),
(7, NULL),
(8, NULL),
(9, 15)
as (aa,bb)) as T (a, b) sequence by a;

--
--
--  Test for correct scoping of GROUP BY and SEQUENCE BY in same query
--

--
--
-- Should return 3 rows
--
select a, avg(b), avg (runningsum(a)) 
from 
(values
(1234,         23.000,      11),
(1234,         24.000,      17),
(1234,         25.000,      14),
(1234,         26.000,      10),
(1234,         27.000,      19),
(1234,         28.000,      14),
(1234,         29.000,      18),
(1234,         30.000,      18),
(1234,         31.000,      12),
(2345,         23.000,      14),
(2345,         24.000,      15),
(2345,         25.000,      15),
(2345,         26.000,      11),
(2345,         27.000,      17),
(2345,         28.000,      11),
(2345,         29.000,      11),
(2345,         30.000,      15),
(2345,         31.000,      12),
(3456,         23.000,      17),
(3456,         24.000,      16),
(3456,         25.000,      11),
(3456,         26.000,      17),
(3456,         27.000,      14),
(3456,         28.000,      10),
(3456,         29.000,      19),
(3456,         30.000,      14),
(3456,         31.000,      18))
as T(a, b, c) 
sequence by a, b
group by a;

--
-- Error 4109: Sequence function placed incorrectly
-- Genesis case 10-990823-0045 
--
select a, avg(b), runningsum(a) 
from 
(values
(1234,         23,      11),
(1234,         24,      17),
(1234,         25,      14),
(1234,         26,      10),
(1234,         27,      19),
(1234,         28,      14),
(1234,         29,      18),
(1234,         30,      18),
(1234,         31,      12),
(2345,         23,      14),
(2345,         24,      15),
(2345,         25,      15),
(2345,         26,      11),
(2345,         27,      17),
(2345,         28,      11),
(2345,         29,      11),
(2345,         30,      15),
(2345,         31,      12),
(3456,         23,      17),
(3456,         24,      16),
(3456,         25,      11),
(3456,         26,      17),
(3456,         27,      14),
(3456,         28,      10),
(3456,         29,      19),
(3456,         30,      14),
(3456,         31,      18))
as T(a, b, c) 
sequence by a, b
group by a;

--
--  Tests valid ROWS SINCE nesting
--  Genesis case 10-990301-0576 
--
select a, b, c, movingavg(c, 3, rows since (this (a) <> a))
from 
(values
(1234,         23,      11.000),
(1234,         24,      17.000),
(2345,         23,      14.000),
(2345,         24,      15.000),
(2345,         25,      15.000),
(2345,         26,      11.000))
as T(a, b, c) 
sequence by a, b;


--
-- Tests correct trapping for divide by zero
--
-- Genesis case 10-990219-0316
--

select a, diff1(b, c)
from
(values
(1234,         23,      11),
(1234,         24,      12),
(1234,         25,      13),
(2345,         23,      14),
(2345,         24,      14),
(2345,         25,      15),
(2345,         26,      15),
(2345,         27,      16),
(2345,         27,      16),
(3452,         23,      17),
(3452,         24,      17),
(3452,         25,      17),
(3452,         26,      18),
(3452,         27,      18),
(3452,         28,      18),
(3452,         29,      19),
(3452,         30,      19),
(3452,         31,      19))
as T(a, b, c)
sequence by a, b;

--
--
-- Test for non-Pcode Evaluation
--
-- Genesis case 10-990729-3914
--
create table t063t2  (a int, b int, c smallint, d largeint);
 
insert into t063t2 values
     (2, 74, 27648, 498921136),
     (80, 24011, 22223, 859834),
     (89, 28238, 28519, 285854226),
     (51, 15294, 18450, 100322507),
     (33, 9031, 32354, 1130723134),
     (53, 15474, 5573, 476322978),
     (50, 15250, 24665, 196331131),
     (71, null, 27138, 37182688),
     (76, 23010, 6585, 666815330),
     (47, 13457, 32039, 186130057);
 
control query default PCODE_OPT_LEVEL 'OFF';
 
 select a, b,
        runningcount(*) as rcount_star,
        runningsum(b) as rsum_b,
        rank(a) as rank
     from t063t2
       sequence by a;
 
 select b, runningsum(b), runningcount(*), rank(a)
     from t063t2
       sequence by a;

control query default PCODE_OPT_LEVEL '2';
--
-- Test for nested sequence functions within derived tables
--
-- Genesis Case Number: 10-990301-0569

create table t063t3 (
    account_num int,
    wk int,
    wkly_ad_clicks int
    );

insert into t063t3 values
    (1234,         23,      11),
    (1234,         24,      17),
    (2345,         23,      14),
    (2345,         24,      15),
    (2345,         25,      15),
    (2345,         26,      11);

select account_num, wk, diff1 (ad_clicks_mov_avg)
  from (
    select account_num, wk,
           movingavg (wkly_ad_clicks, 3,
           rows since (account_num <> OFFSET (account_num,1)))
        from t063t3
        sequence by account_num, wk
       ) as T1 ( account_num, wk, ad_clicks_mov_avg)
  sequence by account_num, wk;

-- Tests for protective sequence function transformations to avoid
-- short-circuiting. The generator define GEN_DISABLE_SF_PROTECT disables the
-- protective sequence function transformation. At this point, all of 
-- these tests should fail if the generator define GEN_DISABLE_SF_PROTECT
-- is set.
--
-- Test the ITM_SCALAR_MIN transformation.
--
-- The second and third arguments of offset are combined using the scalar
-- min function. If short-circuiting is allowed, the rows since is not
-- computed on each rows and the offset returns the incorrect value.
--
?section SCBUG_Q1
select b,c,offset (c, (rows since inclusive (b = 30)), 99) 
from t063t1 sequence by a order by a;

-- Test the ITM_CASE transformation.
--
?section SCBUG_Q2
select offset(runningsum(a),1),
	offset(case when a < 10 then runningsum(a) else runningsum(a) end, 1)
from t063t1 sequence by a order by a;


-- Test the ITM_OR transformation. 
--
-- Each of the rows since expressions in the following query should
-- return the same result. However, when short-circuiting is allowed, the
-- second rows since gives incorrect results because the sum on the right
-- side of the OR is skipped for the first rows because the left side is
-- TRUE.
-- 
?section SCBUG_Q3
select rows since inclusive (runningsum(b) < 300), 
	rows since inclusive (runningsum(b) < 300 OR runningsum(b) < 300)
from t063t1 sequence by a order by a;

-- Test the ITM_AND transformation. 
--
-- Both of the rows since expressions in the following query should
-- return the same result. However, when short-circuiting is allowed, the
-- second rows since gives incorrect results because the sum on the right
-- side of the AND is skipped for the first rows because the left side is
-- FALSE.
-- 
?section SCBUG_Q4
select rows since inclusive (runningsum(b) > 300), 
	rows since inclusive (runningsum(b) > 300 AND runningsum(b) > 300)
from t063t1 sequence by a order by a;

-- Test nested case
--
?section SCBUG_Q5
select offset(runningsum(a),1),
	offset(case when a < 10 then 
		case when a < 5 then runningsum(a) else runningsum(a) end
		else runningsum(a) end, 1)
from t063t1 sequence by a order by a;

-- Test nested sequence functions
--
?section SCBUG_Q6
select offset(runningsum(a),1),
	offset(case when a < 10 then runningsum(a) else runningsum(a) end, 1)
from 
	(select offset(runningsum(a),1),
	offset(case when a < 10 then runningsum(a) else runningsum(a) end, 1)
	from t063t1 sequence by a) T(a,b)
sequence by a order by a;

--
--
-- Test for movingsum with all nulls in moving window
--
-- Genesis Case Number: 10-020725-5529

-- The following shows an example of MOVINGSUM with a moving window size of 3 where all 
-- values (b) are NULL. The second expression shows the correct equivalent MOVINGSUM semantics:

select a, b, MOVINGSUM(b,3) as MSUM1, CASE MOVINGCOUNT(b,3) WHEN 0 THEN NULL ELSE MOVINGSUM(b,3) END as MSUM2 FROM
(values
(8, 1),
(9, NULL),
(11, NULL),
(17, NULL),
(33, 6),
(34, NULL),
(35, NULL),
(36, NULL),
(37, 7))
as T(a,b) sequence by a;

--
-- The following shows an example of MOVINGAVG with a moving window size of 3 where all 
-- values (b) are NULL. The second expression shows the correct equivalent MOVINGAVG semantics:

select a, b, MOVINGAVG(b,3) as MAVG1, CASE MOVINGCOUNT(b,3) WHEN 0 THEN NULL ELSE MOVINGSUM(b,3)/MOVINGCOUNT(b,3) END as MAVG2 FROM
(values
(8, 1),
(9, NULL),
(11, NULL),
(17, NULL),
(33, 6),
(34, NULL),
(35, NULL),
(36, NULL),
(37, 7))
as T(a,b) sequence by a;

--
--
-- Test for movingsum with window size of 0
--
-- The following show examples of MOVINGSUM and MOVINGAVG with a moving window size of 0
-- 

select a, b, MOVINGSUM(b,0) as MSUM, MOVINGAVG(b,0) as MAVG FROM
(values
(8, 1),
(9, 2),
(11, NULL),
(33, 6),
(37, 7))
as T(a,b) sequence by a;

select a, b, c, MOVINGSUM(c,b) as MSUM, MOVINGAVG(c,b) as MAVG FROM
(values
(1,1, 1),
(2,0, 2),
(3,2, NULL),
(4,0, 6),
(5,3, 7))
as T(a,b,c) sequence by a;

--
-- Test for Case-10-021213-4041: MOVINGMIN/MAX do not treat negative window
-- sizes properly.
--

select a, b, 
movingmax(b,a,2000) as MMAX_ORG, 
CASE WHEN (a < 0 OR a IS NULL) THEN runningmax(b) ELSE movingmax(b,a) END AS MMAX_CORRECT
from (values 
(2,    1, 1),
(2,    2, 2),
(2,    3, 3),
(2,   16, 4),
(-2,   1, 5),
(2,    2, 6),
(-2,   3, 7),
(2,    5, 8),
(NULL, 1, 9),
(2,    2, 10),
(NULL, 3, 11),
(2,    2, 12),
(2,    3, 13),
(2,   26, 14),
(-2,   1, 15),
(2,    2, 16),
(-2,   3, 17),
(2,    5, 18),
(NULL, 1, 19),
(2,    2, 20),
(NULL, 3, 21),
(2,    2, 22),
(2,    3, 23),
(2,   36, 24),
(-2,   1, 25),
(2,    2, 26),
(-2,   3, 27),
(2,    5, 28),
(NULL, 1, 29),
(2,    2, 30),
(NULL, 3, 31),
(2,    2, 32),
(2,    3, 33),
(2,   46, 34),
(-2,   1, 35),
(2,    2, 36),
(-2,   3, 37),
(2,    5, 38),
(NULL, 1, 39),
(2,    2, 40),
(NULL, 3, 41),
(2,    2, 42),
(2,    3, 43),
(2,   56, 44),
(-2,   1, 45),
(2,    2, 46),
(-2,   3, 47),
(2,    5, 48),
(NULL, 1, 49),
(2,    2, 50),
(NULL, 3, 51),
(2,    2, 52),
(2,    3, 53),
(2,    6, 54),
(-2,   1, 55),
(2,    2, 56),
(-2,   3, 57),
(2,    5, 58),
(NULL, 1, 59),
(2,    2, 60),
(NULL, 3, 61),
(2,    2, 62),
(2,    3, 63),
(2,    6, 64),
(-2,   1, 65),
(2,    2, 66),
(-2,   3, 67),
(2,    5, 68),
(NULL, 1, 69),
(2,    4, 120)) 
as T(a,b,c) SEQUENCE BY c;

log;

drop table olap_emp;

log LOG063 ;


?section olapcrtab

create table olap_emp
 (
   Num           integer unsigned no default  not null not droppable ,
   LastName      char(24)         no default  not null not droppable ,
   FirstName     char(14)         no default  not null not droppable ,
   MiddleInitial char             no default  not null not droppable ,
   Sex           char             no default  not null not droppable ,
   WorkGroupNum  integer unsigned no default  not null not droppable ,
   PayGrade      integer unsigned no default  not null not droppable ,
   AnnualSalary  integer unsigned no default  not null not droppable ,
   DateOfBirth   date             no default  not null not droppable ,
   primary key ( Num ) not droppable
 )
 store by primary key ;

-- ----------------------------------------------------



insert into olap_emp values 
(1,'Anderson','Alvin','A','M',1,1,21,DATE '12/07/1941'),
(2,'Anderson','Anna ','A','F',1,2,22,DATE '12/07/1941'),
(3,'Anderson','Aloysius','A','M',1,3,23,DATE '12/07/1941'),
(4, 'Anderson','Abby ','A','F',1,4,24 ,DATE '12/07/1941'),
(5,'Anderson','Alan ','A','M',1,5,25, DATE '12/07/1941'),
(6,'Anderson','Anne ','A','F',1,6,26,DATE '12/07/1941'),
(7,'Anderson','Abelard','A','M',1,7,27,DATE '12/07/1941'),
(8,'Anderson','Alice','A','F',1,8,28,DATE '12/07/1941'),
(9,'Anderson','Anton','A','M',1,9,29,DATE '12/07/1941'),
(10,'Anderson','Alicia ','A','F',1,10,30,DATE '12/07/1941'),
(11,'Anderson','Abe','A','M',2,1,21,DATE '12/07/1941'),
(12,'Anderson','Amanda ','A','F',2,2,22,DATE '12/07/1941'),
(13,'Anderson','Andrew ','A','M',2,3,23,DATE '12/07/1941'),
(14,'Anderson','Annette','A','F',2,4,24,DATE '12/07/1941'),
(15,'Anderson','Akihiro','A','M',2,5,25,DATE '12/07/1941'),
(16,'Anderson','Andrea ','A','F',2,6,26,DATE '12/07/1941'),
(17,'Anderson','Arthur ','A','M',2,7,27,DATE '12/07/1941'),
(18,'Anderson','Amy  ','A','F',2,8,28,DATE '12/07/1941'),
(19,'Anderson','Arnold ','A','M',2,9,29,DATE '12/07/1941'),
(20,'Anderson','Adriana','A','F',2,10,30,DATE '12/07/1941'),
(21,'Anderson','Arturo ','A','M',3,1,21,DATE '12/07/1941'),
(22,'Anderson','Annabelle','A','F',3,2,22,DATE '12/07/1941'),
(23,'Anderson','Andreas','A','M',3,3,23,DATE '12/07/1941'),
(24,'Anderson','Becky','A','F',3,4,24,DATE '12/07/1941'),
(25,'Anderson','Bill ','A','M',3,5,25,DATE '12/07/1941'),
(26,'Anderson','Betsy','A','F',3,6,26,DATE '12/07/1941'),
(27,'Anderson','Bob  ','A','M',3,7,27,DATE '12/07/1941'),
(28,'Anderson','Belinda','A','F',3,8,28,DATE '12/07/1941'),
(29,'Anderson','Bruce','A','M',3,9,29,DATE '12/07/1941'),
(30,'Anderson','Bridget','A','F',3,10,30,DATE '12/07/1941');




?section olaptest
--***********************************************************************************
--**************************************TESTING**************************************
--***********************************************************************************
--***********************************************************************************

--set schema olapcat.olapsch;

--CONTROL QUERY DEFAULT DEF_MAX_HISTORY_ROWS '1024';

--**************************************ALL OLAP FUNCTIONS/ROWS UNBOUNDED PRECEDING *****************************
SELECT
    num, workgroupnum ,
    RANK()        OVER ( PARTITION BY workgroupnum ORDER BY num    ) ,
    DENSE_RANK(  )    OVER ( PARTITION BY workgroupnum ORDER BY num   ),
    ROW_NUMBER()    OVER ( PARTITION BY workgroupnum ORDER BY num  ) 
FROM olap_emp ;


SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    MIN(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    MAX(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    VARIANCE(AnnualSalary  )  OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    STDDEV(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    COUNT(*)          OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;


--**************************************ALL OLAP FUNCTIONS/ROWS N PRECEDING *****************************


SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 5 PRECEDING  ) ,
    AVG(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 5 PRECEDING  ) ,
    MIN(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 5 PRECEDING  ) ,
    MAX(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 5 PRECEDING  ) ,
    VARIANCE(AnnualSalary  )  OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 5 PRECEDING  ) ,
    STDDEV(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 5 PRECEDING  ) ,
    COUNT(*)          OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 5 PRECEDING  ) 
FROM olap_emp ;

--**************************************ALL OLAP FUNCTIONS/ROWS CURRENT ROW *****************************

SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS CURRENT ROW  ) ,
    AVG(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS CURRENT ROW  ) ,
    MIN(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS CURRENT ROW  ) ,
    MAX(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS CURRENT ROW  ) ,
    VARIANCE(AnnualSalary  )  OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS CURRENT ROW  ) ,
    STDDEV(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS CURRENT ROW  ) ,
    COUNT(*)          OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS CURRENT ROW  ) 
FROM olap_emp ;





--**************************************Support for ASC / DESC****************************

---PARTITION BY/ORDER BY 
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum  ORDER BY num  ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp;

---PARTITION BY/ORDER BY ASC
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum  ORDER BY num ASC ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp;

---PARTITION BY/ORDER BY DESC
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum  ORDER BY num desc ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp;

--*****************************olap with group by*************************************************

SELECT  paygrade,workgroupnum,
    SUM(annualsalary) ,
    SUM( paygrade) OVER (ORDER BY workgroupnum, num rows UNBOUNDED PRECEDING)
from olap_emp
group by paygrade,workgroupnum, num
order by 1,2,3,4;


SELECT  paygrade,workgroupnum, 
    SUM(annualsalary) ,
    SUM( paygrade) OVER (PARTITION BY workgroupnum ORDER BY SUM(annualsalary)  ROWS UNBOUNDED PRECEDING)
from olap_emp
group by paygrade,workgroupnum;
SELECT  paygrade,workgroupnum, 
    SUM(annualsalary) ,
    SUM( paygrade) OVER (PARTITION BY workgroupnum ORDER BY sum_sal  ROWS UNBOUNDED PRECEDING)
from 
 (select paygrade,workgroupnum,annualsalary, sum(annualsalary) sum_sal from olap_emp group by paygrade,workgroupnum, annualsalary) T group by paygrade,workgroupnum,sum_sal;


---supported
SELECT  paygrade,workgroupnum, 
    SUM(annualsalary) ,
    AVG( SUM(annualsalary) ) OVER (PARTITION BY paygrade ORDER BY workgroupnum   ROWS UNBOUNDED PRECEDING)
from olap_emp
group by paygrade,workgroupnum
order by 1,2,3,4;

SELECT  paygrade,workgroupnum, 
    SUM(annualsalary) ,
    SUM( AVG(annualsalary) ) OVER (PARTITION BY paygrade ORDER BY workgroupnum   ROWS UNBOUNDED PRECEDING)
from olap_emp
group by paygrade,workgroupnum
order by 1,2,3,4;


--********************************** Multiple (PARTITION BY /ORDER BY) support*****************************

SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ORDER BY num           ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ORDER BY num           ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum    ORDER BY num           ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ORDER BY num      DESC     ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ORDER BY num     DESC     ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ORDER BY num     DESC    ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum                ROWS UNBOUNDED PRECEDING  ) as olapsum,
    AVG(AnnualSalary  ) OVER ( PARTITION BY workgroupnum                ROWS UNBOUNDED PRECEDING  ) as olapavg
FROM olap_emp ) T
GROUP BY workgroupnum;


SELECT  num, workgroupnum, annualsalary,     
    SUM(AnnualSalary  ) OVER (                 ORDER BY num           ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER (                 ORDER BY num           ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

-- ORDER BY desc / ORDER BY
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (                ORDER BY num    DESC    ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER (                 ORDER BY num           ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;


SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (                 ORDER BY num     DESC    ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER (                 ORDER BY num     DESC    ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

---<> ORDER BY's

SELECT  num, workgroupnum, paygrade, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ORDER BY num           ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER ( PARTITION BY workgroupnum, 
                        paygrade     ORDER BY num           ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

---
SELECT  num, workgroupnum, paygrade, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ORDER BY num           ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER (                 ORDER BY num           ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;
---
SELECT  num, workgroupnum, paygrade, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum                   ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER (                 ORDER BY num           ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;
---
SELECT  num, workgroupnum, paygrade, annualsalary, 
    SUM(AnnualSalary  ) OVER (               ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  ) OVER (      ORDER BY num      ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;


---**************************************Olap distinct support****************************
SELECT  num, workgroupnum, annualsalary, 
    SUM(distinct AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

SELECT  num, workgroupnum, annualsalary, 
    SUM(all AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;


---************************************** PARAMs************************************************
set PARAM ?empnum 20;

SELECT  ?empnum,num, workgroupnum, annualsalary, 
    SUM(all AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp 
where num < ?empnum;

prepare s1 from SELECT  ?, workgroupnum, annualsalary --, 
    ---SUM(all AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;


SELECT  num, workgroupnum, annualsalary, 
    SUM(all AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp 
where num < 20
order by 1, 2, 3, 4;


--************************************olap and Sequence functions in SELECT list *****************************
-- no SEQUENCE BY

SELECT RUNNINGCOUNT(AnnualSalary  ) 
FROM olap_emp ;


SELECT RUNNINGSUM(AnnualSalary  ) 
FROM olap_emp 
SEQUENCE BY num;

--- olap and sequence functions together 
SELECT num, SUM(AnnualSalary  ) OVER (  ORDER BY num  ROWS UNBOUNDED PRECEDING  ),
RUNNINGSUM(AnnualSalary  )
FROM olap_emp ;

---olap and sequence functions together
SELECT num, RUNNINGSUM(AnnualSalary  ), SUM(AnnualSalary  ) OVER (  ORDER BY num  ROWS UNBOUNDED PRECEDING  )
FROM olap_emp ;

--- olap and sequence functions together
SELECT num, runningSUM(AnnualSalary  ), SUM(AnnualSalary  ) OVER (  ORDER BY num  ROWS UNBOUNDED PRECEDING  )
FROM olap_emp 
sequence by num;

--- olap and sequence functions together
SELECT num, SUM(AnnualSalary  ) OVER (  ORDER BY num  ROWS UNBOUNDED PRECEDING  ), runningSUM(AnnualSalary  )
FROM olap_emp 
sequence by num;

--************************************olap / qequence in where clause*****************************

SELECT num, SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum  ORDER BY num  ROWS UNBOUNDED PRECEDING  )
FROM olap_emp 
where SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum  ORDER BY num  ROWS UNBOUNDED PRECEDING  ) > 100;

SELECT num, runningSUM(AnnualSalary  )
FROM olap_emp 
where runningSUM(paygrade  ) > 100
sequence by num;


---************************************** WINDOW FRAME SUPPORT************************************************
---PARTITIN BY & ORDER BY
----------ROWS UNBOUNDED PRECEDING ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS <n> PRECEDING ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS CURRENT ROW ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND <n> PRECEDING ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
    --SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND <n> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
  --  SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 6 PRECEDING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> PRECEDING (<n> >= <m>) ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 6 PRECEDING AND 3 PRECEDING   ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> PRECEDING (<n> < <m>) ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 3 PRECEDING AND 6 PRECEDING   ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND CURRENT ROW ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 6 PRECEDING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 3 PRECEDING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND <n> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN CURRENT ROW AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND CURRENT ROW ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN CURRENT ROW AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND <n> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN CURRENT ROW AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND <n> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING  ) 
FROM olap_emp ;
----------ROWS BETWEEN UNBOUNDED FOLLOWING AND <n> FOLLOWING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND 6 FOLLOWING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 6 FOLLOWING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 3 FOLLOWING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND CURRENT ROW ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 6 FOLLOWING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> FOLLOWING (<n> <= <m>) ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 3 FOLLOWING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> FOLLOWING (<n> > <m>) ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 6 FOLLOWING AND 3 FOLLOWING  ) 
FROM olap_emp ;




---PARTITIN BY & NO ORDER BY
----------ROWS UNBOUNDED PRECEDING ===> Supported
SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS UNBOUNDED PRECEDING  )  as olapsum
FROM olap_emp ) T
GROUP BY workgroupnum;

----------ROWS <n> PRECEDING ===> Supported
SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS 6 PRECEDING  ) as olapsum
FROM olap_emp ) T
GROUP BY workgroupnum;

----------ROWS CURRENT ROW ===> Supported
SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS CURRENT ROW  ) AS olapsum
FROM olap_emp ) T
GROUP BY workgroupnum;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND <n> PRECEDING ===> Supported
SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED PRECEDING AND 6 PRECEDING  ) AS olapsum
FROM olap_emp ) T
GROUP BY workgroupnum;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ===> Supported
SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  )  AS olapsum
FROM olap_emp ) T
GROUP BY workgroupnum;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND <n> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED PRECEDING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 6 PRECEDING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> PRECEDING (<n> >= <m>) ===> Supported
SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 6 PRECEDING AND 3 PRECEDING   )  AS olapsum
FROM olap_emp  ) T
GROUP BY workgroupnum;

----------ROWS BETWEEN <n> PRECEDING AND <m> PRECEDING (<n> < <m>) ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 3 PRECEDING AND 6 PRECEDING   ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND CURRENT ROW ===> Supported
SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 6 PRECEDING AND CURRENT ROW  ) 
FROM olap_emp ) T
GROUP BY workgroupnum;

----------ROWS BETWEEN <n> PRECEDING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 3 PRECEDING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND <n> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN CURRENT ROW AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND CURRENT ROW ===> Supported
SELECT workgroupnum, count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN CURRENT ROW AND CURRENT ROW  ) 
FROM olap_emp ) T
GROUP BY workgroupnum;

----------ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND <n> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN CURRENT ROW AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND <n> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED FOLLOWING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING  ) 
FROM olap_emp ;
----------ROWS BETWEEN UNBOUNDED FOLLOWING AND <n> FOLLOWING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN UNBOUNDED FOLLOWING AND 6 FOLLOWING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 6 FOLLOWING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 3 FOLLOWING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND CURRENT ROW ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 6 FOLLOWING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> FOLLOWING (<n> <= <m>) ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 3 FOLLOWING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> FOLLOWING (<n> > <m>) ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum     ROWS BETWEEN 6 FOLLOWING AND 3 FOLLOWING  ) 
FROM olap_emp ;

---NO PARTITIN BY & ORDER BY
----------ROWS UNBOUNDED PRECEDING ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS <n> PRECEDING ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS CURRENT ROW ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND <n> PRECEDING ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND <n> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 6 PRECEDING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> PRECEDING (<n> >= <m>) ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 6 PRECEDING AND 3 PRECEDING   ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> PRECEDING (<n> < <m>) ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 3 PRECEDING AND 6 PRECEDING   ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND CURRENT ROW ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 6 PRECEDING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 3 PRECEDING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND <n> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN CURRENT ROW AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND CURRENT ROW ===> Supported
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN CURRENT ROW AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND <n> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN CURRENT ROW AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND <n> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING  ) 
FROM olap_emp ;
----------ROWS BETWEEN UNBOUNDED FOLLOWING AND <n> FOLLOWING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN UNBOUNDED FOLLOWING AND 6 FOLLOWING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 6 FOLLOWING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 3 FOLLOWING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND CURRENT ROW ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 6 FOLLOWING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> FOLLOWING (<n> <= <m>) ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 3 FOLLOWING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> FOLLOWING (<n> > <m>) ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (  ORDER BY num       ROWS BETWEEN 6 FOLLOWING AND 3 FOLLOWING  ) 
FROM olap_emp ;

--=============

---NO PARTITIN BY & NO ORDER BY
----------ROWS UNBOUNDED PRECEDING ===> Supported
SELECT count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS UNBOUNDED PRECEDING  )  as olapsum
FROM olap_emp ) T;

----------ROWS <n> PRECEDING ===> Supported
SELECT count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS 6 PRECEDING  ) as olapsum
FROM olap_emp ) T;

----------ROWS CURRENT ROW ===> Supported
SELECT  count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS CURRENT ROW  ) AS olapsum
FROM olap_emp ) T;


----------ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND <n> PRECEDING ===> Supported
SELECT count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED PRECEDING AND 6 PRECEDING  ) AS olapsum
FROM olap_emp ) T;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ===> Supported
SELECT count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  )  AS olapsum
FROM olap_emp ) T;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED PRECEDING AND <n> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED PRECEDING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 6 PRECEDING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> PRECEDING (<n> >= <m>) ===> Supported
SELECT count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 6 PRECEDING AND 3 PRECEDING   )  AS olapsum
FROM olap_emp  ) T;

----------ROWS BETWEEN <n> PRECEDING AND <m> PRECEDING (<n> < <m>) ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 3 PRECEDING AND 6 PRECEDING   ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND CURRENT ROW ===> Supported
SELECT count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 6 PRECEDING AND CURRENT ROW  ) 
FROM olap_emp ) T;

----------ROWS BETWEEN <n> PRECEDING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> PRECEDING AND <m> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 3 PRECEDING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND <n> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN CURRENT ROW AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND CURRENT ROW ===> Supported
SELECT count(*)
FROM (
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN CURRENT ROW AND CURRENT ROW  ) 
FROM olap_emp ) T;

----------ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN CURRENT ROW AND <n> FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN CURRENT ROW AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND <n> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED FOLLOWING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING  ) 
FROM olap_emp ;
----------ROWS BETWEEN UNBOUNDED FOLLOWING AND <n> FOLLOWING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN UNBOUNDED FOLLOWING AND 6 FOLLOWING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND UNBOUNDED PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 6 FOLLOWING AND UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> PRECEDING ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 3 FOLLOWING AND 6 PRECEDING  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND CURRENT ROW ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 6 FOLLOWING AND CURRENT ROW  ) 
FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND UNBOUNDED FOLLOWING ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> FOLLOWING (<n> <= <m>) ===> Unsupported
--SELECT  num, workgroupnum, annualsalary, 
--    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 3 FOLLOWING AND 6 FOLLOWING  ) 
--FROM olap_emp ;

----------ROWS BETWEEN <n> FOLLOWING AND <m> FOLLOWING (<n> > <m>) ===> Illegal
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER (      ROWS BETWEEN 6 FOLLOWING AND 3 FOLLOWING  ) 
FROM olap_emp ;

---************************************** History buffer************************************************



--CONTROL QUERY DEFAULT DEF_MAX_HISTORY_ROWS '10';
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS 9 PRECEDING  ) 
FROM olap_emp ;




--CONTROL QUERY DEFAULT DEF_MAX_HISTORY_ROWS '10';
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND 9 PRECEDING  ) 
FROM olap_emp ;


--CONTROL QUERY DEFAULT DEF_MAX_HISTORY_ROWS '7';
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 9 PRECEDING AND 8 PRECEDING  ) 
FROM olap_emp ;

--CONTROL QUERY DEFAULT DEF_MAX_HISTORY_ROWS '7';
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN 9 PRECEDING AND CURRENT ROW  ) 
FROM olap_emp ;

---************************************** Window Size > smallint************************************************

--CONTROL QUERY DEFAULT DEF_MAX_HISTORY_ROWS '1024';
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  ) OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS BETWEEN UNBOUNDED PRECEDING AND 65535 PRECEDING  ) 
FROM olap_emp ;



--**************************************olap functions in diffrent scopes*****************************
SELECT *
FROM ( SELECT num, SUM(AnnualSalary) OVER ( PARTITION BY workgroupnum ORDER BY num ROWS UNBOUNDED PRECEDING  ) sumA FROM olap_emp) A,
     ( SELECT num, AVG(AnnualSalary) OVER ( PARTITION BY workgroupnum ORDER BY num ROWS UNBOUNDED PRECEDING  ) avgB FROM olap_emp) B
WHERE A.num=b.num
order by 1,2,3,4;     


SELECT *
FROM ( SELECT num, SUM(AnnualSalary) OVER ( PARTITION BY workgroupnum ORDER BY num ROWS UNBOUNDED PRECEDING  ) sumA FROM olap_emp) A,
     ( SELECT num, AVG(AnnualSalary) OVER ( PARTITION BY workgroupnum ORDER BY paygrade,num ROWS UNBOUNDED PRECEDING  ) avgB FROM olap_emp) B
WHERE A.num=b.num
order by 1,2,3,4;     

SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) 

FROM olap_emp ;
SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY paygrade,num      ROWS UNBOUNDED PRECEDING  ) 
FROM olap_emp ;

SELECT  num, workgroupnum, annualsalary, 
    SUM(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY num       ROWS UNBOUNDED PRECEDING  ) ,
    AVG(AnnualSalary  )      OVER ( PARTITION BY workgroupnum ORDER BY paygrade,num       ROWS UNBOUNDED PRECEDING  ) 

FROM olap_emp ;


--**************************************cancel rank*****************************
SELECT * FROM 
(select rank() over (order by num) r from olap_emp) T
WHERE r > 10;

SELECT * FROM 
(select rank() over (order by num) r from olap_emp) T
WHERE r >=10;




SELECT * FROM 
(select rank() over (order by num) r from olap_emp) T
WHERE r < 10;

SELECT * FROM 
(select rank() over (order by num) r from olap_emp) T
WHERE r <=10;




SELECT * FROM 
(select rank() over (order by num) r from olap_emp) T
WHERE r <= 10 or r>= 20;




SELECT * FROM 
(select rank() over (order by num) r from olap_emp) T
WHERE r <= 10 or r<= 5;



SELECT * FROM 
(select num,rank() over (order by num) r from olap_emp) T
WHERE r <= 10 or num >20;



SELECT * FROM 
(select num,rank() over (order by num) r from olap_emp) T
WHERE r not in (select rank() over (order by num) r from olap_emp where num >12);

--**************************************rank over 2 or more solumns**************************

select rank() over (order by paygrade,num) from olap_emp;

select rank() over (order by paygrade,workgroupnum,num) from olap_emp;

select paygrade,workgroupnum,num,rank() over (order by paygrade,workgroupnum,num) from olap_emp;

--**************************************rank with delete/update*****************************
delete from olap_emp where rank() over (order by paygrade,num) =1;

update emp set paygrade = rank() over (order by paygrade,num);

-- *****************************test moving rank transformation*****************************
-- rank() over (partition by a order by b) ==> (rows since changed (a) - rows since changed (a,b)

SELECT workgroupnum,paygrade, sum_annualsalary,Rank() over (partition by workgroupnum order by sum_annualsalary) TD_RANK 
FROM  (SELECT workgroupnum,paygrade, SUM(annualsalary) sum_annualsalary FROM olap_emp GROUP BY workgroupnum,paygrade)  T
ORDER BY 2 DESC, 1;

--control query default DEF_MAX_HISTORY_ROWS '5';

select sex,paygrade, rank() over (partition by sex order by paygrade) r from olap_emp;

select rank() over (partition by sex,lastname order by paygrade) r from olap_emp;

select rank() over (partition by sex order by paygrade,num) r from olap_emp;

select rank() over (partition by sex,lastname order by paygrade,num) r from olap_emp;

select rank() over (partition by sex order by lastname,paygrade,num) r from olap_emp;

select rank() over (partition by dateofbirth,sex order by lastname,paygrade,num) r from olap_emp;


select rank() over (partition by sex,lastname,left(firstname,2),middleinitial order by paygrade) r from olap_emp;


select rank() over (partition by sex,lastname,middleinitial order by paygrade,num) r from olap_emp;


select rank() over (partition by sex,lastname,left(firstname,2),middleinitial order by paygrade,workgroupnum,num) r from olap_emp;

--control query default DEF_MAX_HISTORY_ROWS reset;

--***************************** test partition by /order by with rank/dense_rank*****************************

select  rank() over (partition by sex ) from olap_emp;

select  dense_rank() over (partition by sex ) from olap_emp;


select  rank() over ( order by sex ) from olap_emp;

select  dense_rank() over (  order by sex ) from olap_emp;


select  rank() over (  ) from olap_emp;

select  dense_rank() over (   ) from olap_emp;

--***************************** test expressions in order by *****************************
prepare stat1 from
select case when workgroupnum=1 then 'x' when workgroupnum=2 then 'y' else 'z' end trans_count_expr, sex,
 rank() over (order by case when workgroupnum=1 then 'x' when workgroupnum=2 then 'y' else 'z' end, sex)  olap_rank  
from olap_emp;
-- result should match previous statement result
prepare stat2 from
select case when workgroupnum=1 then 'x' when workgroupnum=2 then 'y' else 'z' end trans_count_expr, sex,
 rank() over (order by trans_count_expr, sex)  olap_rank  
from (select workgroupnum,sex,case when workgroupnum=1 then 'x' when workgroupnum=2 then 'y' else 'z' end trans_count_expr from olap_emp) T;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

prepare stat1 from
select -1 * annualsalary neg_total, rank() over (order by -1 * annualsalary) olap_rank  from olap_emp;
prepare stat2 from
select -1 * annualsalary neg_total, rank() over (order by neg_total2) olap_rank  from 
(select annualsalary, -1 * annualsalary neg_total2 from olap_emp) T;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

prepare stat1 from
select annualsalary/paygrade as A, rank() over(order by annualsalary/paygrade) olap_rank from olap_emp;
prepare stat2 from
select annualsalary/paygrade as A, rank() over(order by B) olap_rank from 
(select annualsalary,paygrade, annualsalary/paygrade B from olap_emp) T;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

prepare stat1 from
select annualsalary/cast(paygrade as DECIMAL(9,2)) as A,  rank() over (order by annualsalary/cast(paygrade as DECIMAL(9,2))) olap_rank from olap_emp;
prepare stat2 from
select annualsalary/cast(paygrade as DECIMAL(9,2)) as A,  rank() over (order by B) olap_rank from
(select annualsalary, paygrade, annualsalary/cast(paygrade as DECIMAL(9,2)) B from olap_emp) T;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

prepare stat1 from
select paygrade,  rank() over (order by paygrade +10) olap_rank from olap_emp;
prepare stat2 from
select paygrade,  rank() over (order by pay_total) olap_rank from 
(select paygrade, paygrade+10 pay_total from olap_emp) T;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

prepare stat1 from
select paygrade,  rank() over (order by paygrade -10) olap_rank from olap_emp;
prepare stat2 from
select paygrade,  rank() over (order by pay_total) olap_rank from 
(select paygrade, paygrade-10 pay_total from olap_emp) T;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

-- aggregates in order by
prepare stat1 from
select num, rank() over (order by sum(annualsalary)) olap_rank from olap_emp group by num order by num;
prepare stat2 from
select num, rank() over (order by sum_a) olap_rank from
 (select num,sum(annualsalary) sum_a from olap_emp group by num) T order by num;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

prepare stat1 from
select num, rank() over (order by avg(annualsalary)) olap_rank from olap_emp group by num order by num;
prepare stat2 from
select num, rank() over (order by avg_a) olap_rank from
 (select num,avg(annualsalary) avg_a from olap_emp group by num) T order by num;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;
     
prepare stat1 from
select num, rank() over (order by min(annualsalary)) olap_rank from olap_emp group by num order by num;
prepare stat2 from
select num, rank() over (order by min_a) olap_rank from
 (select num,min(annualsalary) min_a from olap_emp group by num) T order by num;     
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

prepare stat1 from
select num, rank() over (order by max(annualsalary)) olap_rank from olap_emp group by num order by num;
prepare stat2 from
select num, rank() over (order by max_a) olap_rank from
 (select num,max(annualsalary) max_a from olap_emp group by num) T order by num;  
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;
   
prepare stat1 from
select num, rank() over (order by variance(annualsalary)) olap_rank from olap_emp group by num order by num;
prepare stat2 from
select num, rank() over (order by variance_a) olap_rank from
 (select num,variance(annualsalary) variance_a from olap_emp group by num) T order by num;   
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;
        
prepare stat1 from
select num, rank() over (order by stddev(annualsalary)) olap_rank from olap_emp group by num order by num;
prepare stat2 from
select num, rank() over (order by stddev_a) olap_rank from
 (select num,stddev(annualsalary) stddev_a from olap_emp group by num) T order by num;   
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;
     
prepare stat1 from
select num, rank() over (order by count(*)) olap_rank from olap_emp group by num order by num;
prepare stat2 from
select num, rank() over (order by cnt) olap_rank from
 (select num,count(*) cnt from olap_emp group by num) T order by num; 
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;
 
--***************************** multiple olap functions w/ same expression in order by ***************************** 
prepare stat1 from
select num, workgroupnum,
       rank() over (order by sum(annualsalary)*num) olap_rank,  
       dense_rank() over (order by sum(annualsalary)*num) olap_drank,
       row_number() over (order by sum(annualsalary)*num) olap_rnum
from olap_emp 
group by num, workgroupnum, annualsalary 
order by num, workgroupnum;

prepare stat2 from
select num, workgroupnum,
       rank() over (order by suma_num) olap_rank, 
       dense_rank() over (order by suma_num) olap_drank,
       row_number() over (order by suma_num) olap_rnum       
from
 (select num,workgroupnum, annualsalary,
         sum(annualsalary)*num suma_num 
  from olap_emp 
  group by num, workgroupnum, annualsalary) T 
  order by num, workgroupnum;
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

prepare stat1 from
select num, workgroupnum, annualsalary, 
    SUM(AnnualSalary)      OVER (order by sum(annualsalary)*num ROWS UNBOUNDED PRECEDING ) ,
    AVG(AnnualSalary)      OVER (order by sum(annualsalary)*num ROWS UNBOUNDED PRECEDING ) ,
    MIN(AnnualSalary)      OVER (order by sum(annualsalary)*num ROWS UNBOUNDED PRECEDING ) ,
    MAX(AnnualSalary)      OVER (order by sum(annualsalary)*num ROWS UNBOUNDED PRECEDING ) ,
    VARIANCE(AnnualSalary)  OVER (order by sum(annualsalary)*num ROWS UNBOUNDED PRECEDING ) ,
    STDDEV(AnnualSalary)      OVER (order by sum(annualsalary)*num ROWS UNBOUNDED PRECEDING ) ,
    COUNT(*)          OVER (order by sum(annualsalary)*num ROWS UNBOUNDED PRECEDING ) 
from olap_emp 
group by num, workgroupnum, annualsalary 
order by num, workgroupnum; 

prepare stat2 from
select num, workgroupnum, annualsalary, 
    SUM(AnnualSalary)      OVER (order by suma_num ROWS UNBOUNDED PRECEDING ) ,
    AVG(AnnualSalary)      OVER (order by suma_num ROWS UNBOUNDED PRECEDING ) ,
    MIN(AnnualSalary)      OVER (order by suma_num ROWS UNBOUNDED PRECEDING ) ,
    MAX(AnnualSalary)      OVER (order by suma_num ROWS UNBOUNDED PRECEDING ) ,
    VARIANCE(AnnualSalary)  OVER (order by suma_num ROWS UNBOUNDED PRECEDING ) ,
    STDDEV(AnnualSalary)      OVER (order by suma_num ROWS UNBOUNDED PRECEDING ) ,
    COUNT(*)          OVER (order by suma_num ROWS UNBOUNDED PRECEDING ) 
from 
 (select num, workgroupnum, annualsalary, 
         sum(annualsalary)*num suma_num
  from olap_emp 
  group by num,workgroupnum,annualsalary) T 
  order by num, workgroupnum; 
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

--************************** multiple olap functions w/ different expression in order by **************************
select num, workgroupnum,
       rank() over (order by sum(annualsalary)) olap_rank,  
       dense_rank() over (order by avg(annualsalary)) olap_drank,
       row_number() over (order by sum(annualsalary)) olap_rnum
from olap_emp group by num, workgroupnum, annualsalary;

select num, workgroupnum,
       rank() over (order by sum_a) olap_rank, 
       dense_rank() over (order by avg_a) olap_drank,
       row_number() over (order by sum_a) olap_rnum       
from
 (select num,workgroupnum, annualsalary,
         sum(annualsalary) sum_a, 
         avg(annualsalary) avg_a 
  from olap_emp 
  group by num, workgroupnum, annualsalary) T ;

select num, workgroupnum, annualsalary, 
    SUM(AnnualSalary)      OVER (order by sum(annualsalary) ROWS UNBOUNDED PRECEDING ) ,
    AVG(AnnualSalary)      OVER (order by avg(annualsalary) ROWS UNBOUNDED PRECEDING ) ,
    MIN(AnnualSalary)      OVER (order by min(annualsalary) ROWS UNBOUNDED PRECEDING ) ,
    MAX(AnnualSalary)      OVER (order by max(annualsalary) ROWS UNBOUNDED PRECEDING ) ,
    VARIANCE(AnnualSalary)  OVER (order by variance(annualsalary) ROWS UNBOUNDED PRECEDING ) ,
    STDDEV(AnnualSalary)      OVER (order by stddev(annualsalary) ROWS UNBOUNDED PRECEDING ) ,
    COUNT(*)          OVER (order by count(*) ROWS UNBOUNDED PRECEDING ) 
from olap_emp group by num, workgroupnum, annualsalary; 

select num, workgroupnum, annualsalary, 
    SUM(AnnualSalary)      OVER (order by sum_a ROWS UNBOUNDED PRECEDING ) ,
    AVG(AnnualSalary)      OVER (order by avg_a ROWS UNBOUNDED PRECEDING ) ,
    MIN(AnnualSalary)      OVER (order by min_a ROWS UNBOUNDED PRECEDING ) ,
    MAX(AnnualSalary)      OVER (order by max_a ROWS UNBOUNDED PRECEDING ) ,
    VARIANCE(AnnualSalary)  OVER (order by var_a ROWS UNBOUNDED PRECEDING ) ,
    STDDEV(AnnualSalary)      OVER (order by stddev_a ROWS UNBOUNDED PRECEDING ) ,
    COUNT(*)          OVER (order by cnt ROWS UNBOUNDED PRECEDING ) 
from 
(select num,workgroupnum, annualsalary,
        sum(annualsalary) sum_a, 
        avg(annualsalary) avg_a,
        min(annualsalary) min_a,
        max(annualsalary) max_a,
        variance(annualsalary) var_a,
        stddev(annualsalary) stddev_a,
        count(*) cnt from olap_emp group by num, workgroupnum, annualsalary) T ;
 
--***************************** strings in order by *****************************
prepare stat1 from
select substring(firstname, 1 ,4) sub_firstname, rank() over (order by substring(firstname, 1 ,4)) as olap_rank 
from olap_emp;        
prepare stat2 from
select substring(firstname, 1 ,4) sub_firstname, rank() over (order by sub_firstname2) as olap_rank 
from 
 (select firstname,substring(firstname,1,4) sub_firstname2 from olap_emp) T;        
log;
obey COMPARE;
sh diff TEMP1 TEMP2 >> LOG063;
log LOG063;

--***************************** olap with qualify (not allowed) *****************************
select workgroupnum, sex,rank() over(order by workgroupnum, sex) olap_rank
  from olap_emp qualify workgroupnum> 1 and rank() over(order by workgroupnum, sex)<200;

log;

?section olapdroptable
DROP TABLE olap_emp;

--TD RANK
DROP TABLE TDemp_rank;
DROP TABLE TDemployee;
DROP TABLE nulltest ;
----------------------------------
log LOG063;



create table TDemployee
 (
   Num           integer unsigned no default  not null not droppable ,
   LastName      char(24)         no default  not null not droppable ,
   FirstName     char(14)         no default  not null not droppable ,
   MiddleInitial char             no default  not null not droppable ,
   Sex           char             no default  not null not droppable ,
   WorkGroupNum  integer unsigned no default  not null not droppable ,
   PayGrade      integer unsigned no default  not null not droppable ,
   AnnualSalary  integer unsigned no default  not null not droppable ,
   DateOfBirth   date             no default  not null not droppable ,
   primary key ( Num ) not droppable
 )
 store by primary key;

insert into TDemployee values  
(1,'Anderson','Alvin','A','M',1,1,21000,DATE '01/07/1941'),
(2,'Anderson','Anna ','A','F',1,2,22000,DATE '02/07/1941'),
(3,'Anderson','Aloysius','A','M',1,3,23000,DATE '03/07/1941'),
(4, 'Anderson','Abby ','A','F',1,4,24000 ,DATE '04/07/1941'),
(5,'Anderson','Alan ','A','M',1,5,25000, DATE '05/07/1941'),
(6,'Anderson','Anne ','A','F',1,6,26000,DATE '06/07/1941'),
(7,'Anderson','Abelard','A','M',1,7,27000,DATE '07/07/1941'),
(8,'Anderson','Alice','A','F',1,8,28000,DATE '08/07/1941'),
(9,'Anderson','Anton','A','M',1,9,29000,DATE '09/07/1941'),
(10,'Anderson','Alicia ','A','F',1,10,30000,DATE '10/07/1941'),
(11,'Anderson','Abe','A','M',2,1,21000,DATE '11/07/1941'),
(12,'Anderson','Amanda ','A','F',2,2,22000,DATE '12/07/1941'),
(13,'Anderson','Andrew ','A','M',2,3,23000,DATE '01/07/1941'),
(14,'Anderson','Annette','A','F',2,4,24000,DATE '02/07/1941'),
(15,'Anderson','Akihiro','A','M',2,5,25000,DATE '03/07/1941'),
(16,'Anderson','Andrea ','A','F',2,6,26000,DATE '04/07/1941'),
(17,'Anderson','Arthur ','A','M',2,7,27000,DATE '05/07/1941'),
(18,'Anderson','Amy  ','A','F',2,8,28000,DATE '06/07/1941'),
(19,'Anderson','Arnold ','A','M',2,9,29000,DATE '07/07/1941'),
(20,'Anderson','Adriana','A','F',2,10,30000,DATE '08/07/1941'),
(21,'Anderson','Arturo ','A','M',3,1,21000,DATE '09/07/1941'),
(22,'Anderson','Annabelle','A','F',3,2,22000,DATE '10/07/1941'),
(23,'Anderson','Andreas','A','M',3,3,23000,DATE '11/07/1941'),
(24,'Anderson','Becky','A','F',3,4,24000,DATE '12/07/1941'),
(25,'Anderson','Bill ','A','M',3,5,25000,DATE '01/08/1941'),
(26,'Anderson','Betsy','A','F',3,6,26000,DATE '02/08/1941'),
(27,'Anderson','Bob  ','A','M',3,7,27000,DATE '03/08/1941'),
(28,'Anderson','Belinda','A','F',3,8,28000,DATE '04/08/1941'),
(29,'Anderson','Bruce','A','M',3,9,29000,DATE '12/08/1941'),
(30,'Anderson','Bridget','A','F',3,10,30000,DATE '06/08/1941');




CONTROL QUERY DEFAULT COMP_BOOL_200 'ON';



-- SEQUENCE FUNCTIONS -- 

SELECT num ,
 annualsalary,
 RUNNINGSUM(annualsalary),
 RUNNINGAVG(annualsalary), 
 RUNNINGMIN(annualsalary),
 RUNNINGMAX(annualsalary),
 RUNNINGSTDDEV(annualsalary),
 RUNNINGVARIANCE(annualsalary)
FROM
 TDemployee
SEQUENCE BY
  num;

SELECT  num ,
 annualsalary,
 MOVINGSUM(annualsalary,3),
 MOVINGAVG(annualsalary,3),
 MOVINGMIN(annualsalary,3),
 MOVINGMAX(annualsalary,3),
 MOVINGSTDDEV(annualsalary,3),
 MOVINGVARIANCE(annualsalary,3)
FROM
 TDemployee
SEQUENCE BY
  num;

SELECT 
 annualsalary,
 RUNNINGCOUNT(1),
 ROWS SINCE CHANGED (paygrade) ,
 RUNNINGCOUNT(1)-ROWS SINCE CHANGED (paygrade) + 1,
 RANK(paygrade)
FROM
 TDemployee
SEQUENCE BY 
 paygrade;



SELECT RANK(paygrade)  FROM TDemployee SEQUENCE BY paygrade;

SELECT negpaygrade,RANK(negpaygrade) FROM (SELECT -1 * paygrade as negpaygrade from TDemployee) t SEQUENCE BY negpaygrade;


--SF RANK WITH asc/desC 

SELECT RANK(workgroupnum ASC )  FROM TDemployee SEQUENCE BY workgroupnum;

SELECT RANK(workgroupnum DESC )  FROM TDemployee SEQUENCE BY workgroupnum;

SELECT RANK(workgroupnum ASC , sex DESC )  FROM TDemployee SEQUENCE BY workgroupnum, sex;

SELECT RANK(workgroupnum DESC , sex DESC)  FROM TDemployee SEQUENCE BY workgroupnum, sex;

SELECT RANK(workgroupnum ASC , sex ASC)  FROM TDemployee SEQUENCE BY workgroupnum, sex;


---------------------------------

--QUALIFY & SEQUENCE FUNCTIONS
SELECT workgroupnum, sex, RANK(workgroupnum, sex) TD_RANK   FROM TDemployee sequence by workgroupnum, sex qualify workgroupnum> 1 and rank(workgroupnum, sex)<200;


-- NO TD GROUP BY
-- TERADATA TYPE RANK (TD RANK)

SELECT DateOfBirth ,RANK(DateOfBirth) TD_RANK  FROM TDemployee;

SELECT firstname,RANK(firstname) TD_RANK  FROM TDemployee;

SELECT sex,RANK(sex) TD_RANK  FROM TDemployee;

SELECT annualsalary,RANK(annualsalary)  TD_RANK FROM TDemployee;

SELECT annualsalary,RANK(annualsalary)  TD_RANK FROM TDemployee WHERE paygrade >1;

SELECT workgroupnum, sex,RANK(workgroupnum, sex)  TD_RANK  FROM TDemployee;

SELECT sex,RANK(sex) TD_RANK  FROM TDemployee;

SELECT negpaygrade,RANK(negpaygrade)  TD_RANK FROM (SELECT -1 * paygrade as negpaygrade from TDemployee ) t;

--Expressions with TD rank

SELECT CASE WHEN workgroupnum=1 THEN 'x' WHEN workgroupnum=2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE WHEN workgroupnum=1 THEN 'x' WHEN workgroupnum=2 THEN 'y' ELSE 'z' END, sex)  TD_RANK  
FROM TDemployee;

select -1 * annualsalary neg_total, rank(-1 * annualsalary)  TD_RANK  from TDemployee;

SELECT case when workgroupnum =1 then 'A' else 'B' end workgroupnum_expr, sex, 
RANK(case when workgroupnum =1 then 'A' else 'B' end, sex)   TD_RANK 
FROM TDemployee qualify RANK(case when workgroupnum =1 then 'A' else 'B' end, sex) > 1;

--Derived table
SELECT workgroupnum,paygrade, sum_annualsalary,Rank(sum_annualsalary)  TD_RANK 
FROM  (SELECT workgroupnum,paygrade, SUM(annualsalary) sum_annualsalary FROM TDemployee GROUP BY workgroupnum,paygrade)  T
ORDER BY 2 DESC, 1;

SELECT workgroupnum, sum_annualsalary,Rank(sum_annualsalary)  TD_RANK 
FROM  (SELECT workgroupnum, SUM(annualsalary) sum_annualsalary FROM TDemployee GROUP BY workgroupnum)  T
ORDER BY 2 DESC, 1;



--TD and ASC / DESC / default order (desc)

SELECT workgroupnum,RANK(workgroupnum ASC )  TD_RANK  FROM TDemployee;

SELECT workgroupnum,RANK(workgroupnum DESC )  TD_RANK  FROM TDemployee;

SELECT workgroupnum,sex,RANK(workgroupnum ASC , sex DESC )  TD_RANK  FROM TDemployee;

SELECT workgroupnum,sex,RANK(workgroupnum DESC , sex DESC)  TD_RANK  FROM TDemployee;

SELECT workgroupnum,sex,RANK(workgroupnum ASC , sex ASC)  TD_RANK  FROM TDemployee;

SELECT workgroupnum,sex,RANK(workgroupnum ASC , sex)  TD_RANK  FROM TDemployee;

SELECT workgroupnum,sex,RANK(workgroupnum , sex ASC)  TD_RANK  FROM TDemployee;

SELECT workgroupnum,sex,RANK(workgroupnum, sex)  TD_RANK  FROM TDemployee;

SELECT CASE WHEN workgroupnum=1 THEN 'x' WHEN workgroupnum=2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE WHEN workgroupnum=1 THEN 'x' WHEN workgroupnum=2 THEN 'y' ELSE 'z' END ASC, sex)  TD_RANK  
FROM TDemployee;

SELECT workgroupnum,RANK(workgroupnum ASC )  TD_RANK  FROM TDemployee qualify  RANK(workgroupnum ASC ) >1;

-----QUALIFY

SELECT workgroupnum, sex,RANK(workgroupnum, sex) TD_RANK   FROM TDemployee qualify workgroupnum> 1 and rank(workgroupnum, sex)<200;


SELECT workgroupnum, sex, RANK(workgroupnum, sex) TD_RANK   FROM TDemployee qualify paygrade> 1;


SELECT workgroupnum, sex, RANK(workgroupnum, sex) TD_RANK   FROM TDemployee qualify  rank(workgroupnum, sex)<200 and paygrade >1;

--TD rank in qualify clause but no TD Rank in select list

SELECT paygrade, sex  FROM TDemployee qualify RANK(paygrade)> 1;

--TD RANK neither in qualify nor in select list

SELECT paygrade, sex  FROM TDemployee qualify paygrade> 1;

--qualify and devived table

SELECT workgroupnum,paygrade, sum_annualsalary,Rank(sum_annualsalary) TD_RANK 
FROM  (SELECT workgroupnum,paygrade, SUM(annualsalary) sum_annualsalary,SUM(paygrade) as sum_paygrade FROM TDemployee GROUP BY workgroupnum,paygrade)  T
QUALIFY Rank(sum_annualsalary) >5
ORDER BY 3 desc ,1,2;


SELECT workgroupnum, sum_paygrade
FROM  (SELECT workgroupnum, SUM(annualsalary) sum_annualsalary,SUM(paygrade) as sum_paygrade FROM TDemployee GROUP BY workgroupnum)  T
QUALIFY Rank(sum_paygrade) >2
ORDER BY 2 DESC, 1;

SELECT CASE paygrade WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE paygrade WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex)  TD_RANK  
FROM TDemployee
QUALIFY RANK(CASE paygrade WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex) >1;

---TD RANK , QUALIFY & WHERE
SELECT CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex)  TD_RANK  
FROM TDemployee where num <> 1
QUALIFY RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex) >1;

SELECT CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex)  TD_RANK  
FROM TDemployee 
QUALIFY RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex) >1 and workgroupnum<>1;

SELECT CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex)  TD_RANK  
FROM TDemployee
QUALIFY RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END , sex) >1;

-- Multiple TD Ranks & equivalent expressions

SELECT paygrade,  RANK(annualsalary) TD_RANK2 FROM TDemployee qualify rank(paygrade)>  1;

SELECT paygrade,  RANK(paygrade) TD_RANK2 FROM TDemployee qualify rank(paygrade)>  1;

SELECT annualsalary/paygrade as A,  RANK(annualsalary/paygrade) TD_RANK2 FROM TDemployee qualify rank(annualsalary/paygrade)>  1;

SELECT annualsalary/cast(paygrade as DECIMAL(9,2)) as A,  RANK(annualsalary/cast(paygrade as DECIMAL(9,2))) TD_RANK2 FROM TDemployee qualify rank(annualsalary/cast(paygrade as DECIMAL(9,2)))>  1;

SELECT paygrade,  RANK(paygrade +10 ) TD_RANK2 FROM TDemployee qualify rank(paygrade +10)>  1;

SELECT paygrade,  RANK(paygrade +10 ) TD_RANK2 FROM TDemployee qualify rank(paygrade +11)>  1;

SELECT paygrade, sex,RANK(paygrade, sex) TD_RANK1   FROM TDemployee qualify rank(paygrade, sex)<200;

SELECT paygrade, sex,RANK(paygrade, sex) TD_RANK1  ,RANK(paygrade) TD_RANK2 FROM TDemployee qualify paygrade> 1 and rank(paygrade, sex)<200;

SELECT paygrade, sex,RANK(paygrade, sex)  TD_RANK  FROM TDemployee qualify paygrade> 1 and rank(paygrade, sex asc)<200;

SELECT paygrade, sex,RANK(paygrade, sex)  TD_RANK  FROM TDemployee qualify paygrade> 1 and rank(paygrade)<200;

--TD rank & STRINGs 
SELECT substring(firstname, 1 ,4) sub_firstname, rank(substring(firstname, 1 ,4)) as TD_RANK 
FROM TDemployee 
QUALIFY rank(substring(firstname, 1 ,4)) >1;

SELECT substring(firstname, 1 ,4) sub_firstname, rank(substring(firstname, 1 ,4)) as TD_RANK 
FROM TDemployee 
QUALIFY rank(substring(firstname, 1 ,2)) >1;

SELECT UPPER(substring(firstname, 1 ,4)) up_sub_firstname , rank(UPPER(substring(firstname, 1 ,4))) as TD_RANK 
FROM TDemployee 
QUALIFY rank(UPPER(substring(firstname, 1 ,4))) >1;

-----TD RANK and aggregate functions 
SELECT num, Rank(sum(annualsalary))  TD_RANK 
FROM TDemployee
GROUP BY num;

SELECT num, Rank(annualsalary)  TD_RANK ,sum(annualsalary)
FROM TDemployee
GROUP BY num;


SELECT paygrade,rank(annualsalary) r
FROM TDemployee
GROUP BY paygrade
having paygrade>1;

SELECT paygrade,rank(annualsalary) r
FROM TDemployee
GROUP BY paygrade
having paygrade>1;



---TD and SF -- 
SELECT num, runningsum(annualsalary) , rank(annualsalary) from TDemployee;

SELECT num, runningsum(annualsalary) , rank(annualsalary) from TDemployee SEQUENCE BY num;

--RANK in WEHERE clause -- not supported
SELECT num,rank(paygrade) FROM TDemployee where RANK(paygrade) < 2;

-- TD RANK and diffrent scopes

SELECT * FROM (SELECT num, paygrade,RANK(paygrade) r_paygrade  FROM TDemployee) t1 join (SELECT num, workgroupnum, RANK(workgroupnum) r_workgroupnum FROM TDemployee) t2 on t1.num=t2.num order by t1.num;


SELECT paygrade,r,RANK(r) 
FROM 
(SELECT PAYGRADE,RANK(ANNUALSALARY) r FROM TDEMPLOYEE sequence by num ) t;

--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------

--TD GROUP BY

SELECT workgroupnum, sex, RANK(workgroupnum, sex) TD_RANK FROM TDemployee sequence by workgroupnum, sex GROUP BY sex qualify workgroupnum> 1 and rank(workgroupnum, sex)<200;

-- TERADATA TYPE RANK (TD RANK)

SELECT DateOfBirth ,RANK(DateOfBirth) TD_RANK  FROM TDemployee GROUP BY sex,workgroupnum;

SELECT firstname,RANK(firstname) TD_RANK  FROM TDemployee GROUP BY sex;

SELECT workgroupnum,sex,RANK(sex) TD_RANK  FROM TDemployee GROUP BY workgroupnum;

SELECT sex,workgroupnum,annualsalary,RANK(annualsalary)  TD_RANK FROM TDemployee GROUP BY sex,workgroupnum;

SELECT sex,annualsalary,RANK(annualsalary)  TD_RANK FROM TDemployee WHERE paygrade >1 GROUP BY sex;

SELECT workgroupnum, paygrade, sex,RANK(workgroupnum, sex)  TD_RANK  FROM TDemployee GROUP BY paygrade,sex;

SELECT workgroupnum,sex,RANK(sex) TD_RANK  FROM TDemployee GROUP BY workgroupnum,sex;

SELECT negpaygrade,RANK(negpaygrade)  TD_RANK FROM (SELECT workgroupnum, -1 * paygrade as negpaygrade from TDemployee ) t  GROUP BY workgroupnum;

SELECT case when workgroupnum =1 then 'A' else 'B' end expr, paygrade,RANK(paygrade)  TD_RANK FROM TDemployee GROUP BY case when workgroupnum =1 then 'A' else 'B' end;

--Expressions with TD rank

SELECT sex,CASE WHEN workgroupnum=1 THEN 'x' WHEN workgroupnum=2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE WHEN workgroupnum=1 THEN 'x' WHEN workgroupnum=2 THEN 'y' ELSE 'z' END, sex)  TD_RANK  
FROM TDemployee
GROUP BY sex;

select -1 * annualsalary neg_total, rank(-1 * annualsalary)  TD_RANK  from TDemployee GROUP BY dateofbirth;

SELECT case when workgroupnum =1 then 'A' else 'B' end workgroupnum_expr, sex, 
RANK(case when workgroupnum =1 then 'A' else 'B' end, sex)   TD_RANK 
FROM TDemployee 
GROUP BY paygrade
qualify RANK(case when workgroupnum =1 then 'A' else 'B' end, sex) > 1;

--Derived table
SELECT workgroupnum,paygrade, sum_annualsalary,Rank(sum_annualsalary)  TD_RANK 
FROM  (SELECT workgroupnum,paygrade, SUM(annualsalary) sum_annualsalary FROM TDemployee GROUP BY workgroupnum,paygrade)  T
GROUP BY workgroupnum
ORDER BY 2 DESC, 1;



--TD and ASC / DESC / default order (desc)

SELECT sex,workgroupnum,RANK(workgroupnum ASC )  TD_RANK  FROM TDemployee GROUP BY sex;

SELECT workgroupnum,RANK(workgroupnum DESC )  TD_RANK  FROM TDemployee GROUP BY sex;

SELECT paygrade,workgroupnum,sex,RANK(workgroupnum ASC , sex DESC )  TD_RANK  FROM TDemployee GROUP BY paygrade;

SELECT paygrade,workgroupnum,sex,RANK(workgroupnum DESC , sex DESC)  TD_RANK  FROM TDemployee GROUP BY paygrade;

SELECT paygrade,workgroupnum,sex,RANK(workgroupnum ASC , sex ASC)  TD_RANK  FROM TDemployee GROUP BY paygrade;

SELECT paygrade,workgroupnum,sex,RANK(workgroupnum ASC , sex)  TD_RANK  FROM TDemployee GROUP BY paygrade;

SELECT paygrade,workgroupnum,sex,RANK(workgroupnum , sex ASC)  TD_RANK  FROM TDemployee GROUP BY paygrade;

SELECT paygrade,workgroupnum,sex,RANK(workgroupnum, sex)  TD_RANK  FROM TDemployee GROUP BY paygrade;

SELECT CASE WHEN workgroupnum=1 THEN 'x' WHEN workgroupnum=2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE WHEN workgroupnum=1 THEN 'x' WHEN workgroupnum=2 THEN 'y' ELSE 'z' END ASC, sex)  TD_RANK  
FROM TDemployee
GROUP BY sex;

SELECT paygrade, workgroupnum,RANK(workgroupnum ASC )  TD_RANK  FROM TDemployee GROUP BY paygrade qualify  RANK(workgroupnum ASC ) >1;

-----QUALIFY

SELECT workgroupnum, sex,RANK(workgroupnum, sex) TD_RANK   FROM TDemployee GROUP BY paygrade qualify workgroupnum> 1 and rank(workgroupnum, sex)<200;


SELECT paygrade ,workgroupnum, sex, RANK(workgroupnum, sex) TD_RANK   FROM TDemployee  GROUP BY paygrade qualify paygrade> 1;


SELECT workgroupnum, sex, RANK(workgroupnum, sex) TD_RANK   FROM TDemployee  GROUP BY paygrade qualify  rank(workgroupnum, sex)<200 and paygrade >1;

--TD rank in qualify clause but no TD Rank in select list

SELECT paygrade, sex  FROM TDemployee GROUP BY sex qualify RANK(paygrade)> 1;

--TD RANK neither in qualify clause nor in select list

SELECT paygrade, sex  FROM TDemployee GROUP BY sex qualify paygrade> 1;

--qualify and devived table

SELECT workgroupnum,paygrade, sum_annualsalary,Rank(sum_annualsalary) TD_RANK 
FROM  (SELECT workgroupnum,paygrade, SUM(annualsalary) sum_annualsalary,SUM(paygrade) as sum_paygrade FROM TDemployee GROUP BY workgroupnum,paygrade)  T
GROUP BY  workgroupnum
QUALIFY Rank(sum_annualsalary) >5
ORDER BY 3 desc ,1,2;


SELECT workgroupnum, sum_paygrade
FROM  (SELECT workgroupnum, SUM(annualsalary) sum_annualsalary,SUM(paygrade) as sum_paygrade FROM TDemployee GROUP BY workgroupnum)  T
GROUP BY  workgroupnum
QUALIFY Rank(sum_paygrade) >2
ORDER BY 2 DESC, 1;


---TD RANK , QUALIFY & WHERE
SELECT sex, CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex)  TD_RANK  
FROM TDemployee where num <> 1
GROUP BY sex
QUALIFY RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex) >1;

-- Multiple TD Ranks & equivalent expressions
SELECT sex, CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END trans_count_expr, sex,
 RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END ASC, sex)  TD_RANK  
FROM TDemployee
GROUP BY sex
QUALIFY RANK(CASE workgroupnum WHEN 1 THEN 'x' WHEN 2 THEN 'y' ELSE 'z' END , sex) >1;

SELECT paygrade,  RANK(annualsalary) TD_RANK2 FROM TDemployee GROUP BY sex qualify rank(paygrade)>  1;

SELECT sex, paygrade,  RANK(paygrade) TD_RANK2 FROM TDemployee GROUP BY sex qualify rank(paygrade)>  1;

SELECT sex,annualsalary/paygrade as A,  RANK(annualsalary/paygrade) TD_RANK2 FROM TDemployee  GROUP BY sex qualify rank(annualsalary/paygrade)>  1;

SELECT sex,annualsalary/cast(paygrade as DECIMAL(9,2)) as A,  RANK(annualsalary/cast(paygrade as DECIMAL(9,2))) TD_RANK2 FROM TDemployee  GROUP BY sex qualify rank(annualsalary/cast(paygrade as DECIMAL(9,2)))>  1;

SELECT paygrade,  RANK(paygrade +10 ) TD_RANK2 FROM TDemployee  GROUP BY sex qualify rank(paygrade +10)>  1;

SELECT paygrade,  RANK(paygrade +10 ) TD_RANK2 FROM TDemployee  GROUP BY sex qualify rank(paygrade +11)>  1;

SELECT paygrade, sex,RANK(paygrade, sex) TD_RANK1   FROM TDemployee GROUP BY workgroupnum qualify rank(paygrade, sex)<200;

SELECT paygrade, sex,RANK(paygrade, sex) TD_RANK1  ,RANK(paygrade) TD_RANK2 FROM TDemployee  GROUP BY workgroupnum qualify paygrade> 1 and rank(paygrade, sex)<200;

SELECT paygrade, sex,RANK(paygrade, sex)  TD_RANK  FROM TDemployee  GROUP BY workgroupnum qualify paygrade> 1 and rank(paygrade, sex asc)<200;

SELECT paygrade, sex,RANK(paygrade, sex)  TD_RANK  FROM TDemployee  GROUP BY sex,paygrade,workgroupnum qualify paygrade> 1 and rank(paygrade)<200;

--TD rank & STRING Manipulation
SELECT substring(firstname, 1 ,4) sub_firstname, rank(substring(firstname, 1 ,4)) as TD_RANK 
FROM TDemployee 
GROUP BY dateofbirth
QUALIFY rank(substring(firstname, 1 ,4)) >1;

SELECT substring(firstname, 1 ,4) sub_firstname, rank(substring(firstname, 1 ,4)) as TD_RANK 
FROM TDemployee 
GROUP BY sex
QUALIFY rank(substring(firstname, 1 ,2)) >1;

SELECT UPPER(substring(firstname, 1 ,4)) up_sub_firstname , rank(UPPER(substring(firstname, 1 ,4))) as TD_RANK 
FROM TDemployee 
GROUP BY sex,paygrade
QUALIFY rank(UPPER(substring(firstname, 1 ,4))) >1;

-----TD and GROUP BY  -- TD rank and aggregate functions are not-- need to add an error message


SELECT * FROM (SELECT num, paygrade,RANK(paygrade) r_paygrade  FROM TDemployee GROUP BY sex) t1 join (SELECT num, workgroupnum, RANK(workgroupnum) r_workgroupnum FROM TDemployee GROUP BY sex) t2 on t1.num=t2.num order by t1.num;

-------------------------------------------
--NESTING TD rank functions

SELECT RANK(1-RANK(paygrade))  FROM TDemployee ;

SELECT RANK(1-RANK(paygrade))  FROM TDemployee GROUP BY sex;

SELECT RANK(1-RANK(paygrade))  FROM TDemployee QUALIFY RANK(1-RANK(paygrade)) >1;

SELECT RANK(1-RANK(paygrade))  FROM TDemployee GROUP BY sex QUALIFY RANK(1-RANK(paygrade)) >1;

SELECT paygrade  FROM TDemployee QUALIFY RANK(1-RANK(paygrade)) >1;

SELECT paygrade  FROM TDemployee  GROUP BY sex  QUALIFY RANK(1-RANK(paygrade)) >1;
-------------------------------------------
--testing rank with update/delete


create table TDemp_rank
 (
   Num           integer unsigned no default  not null not droppable ,
   PayGrade      integer unsigned no default  not null not droppable ,
   AnnualSalary  integer unsigned no default  not null not droppable ,
   arank   largeint          no default  not null not droppable ,
   primary key ( Num ) not droppable
 )
 store by primary key;

INSERT INTO TDemp_rank SELECT Num, paygrade, AnnualSalary,rank(annualsalary)  FROM TDemployee ;


UPDATE TDemp_rank SET arank = rank(annualsalary);

DELETE FROM  TDemp_rank WHERE rank(annualsalary)=1;

------------------Qualify clause with exists and in predicates --- semi join

select annualsalary,rank(annualsalary) from tdemployee 
qualify exists (select num from tdemployee where num =1 ) and rank(annualsalary) in (1,7,10);

select sex, annualsalary,rank(annualsalary) from tdemployee 
group by sex
qualify exists (select num from tdemployee where num =1 ) and rank(annualsalary) in (1,7,10);

----------------------outer references and parameters
set param ?p 2;
select rank(annualsalary + ?p) from tdemployee;


select num,( select rank(o.num) from tdemployee i where i.num=1)
from tdemployee o;

-------------------NULL ORDERING


CREATE TABLE nulltest 
     ( vch7 varchar(7)
          , nint integer not null
        , nint2 integer
          , ch3 char(3)
          , nnum9 numeric(9,2)
          , ch4 char(4)
          , nnum5 numeric(5,1)
          , vch5 varchar(5)
          , nsint smallint 
        ) store by (nint);


INSERT INTO nulltest VALUES     ('a',           1,     NULL,     'c' ,     0.9,             NULL ,          NULL  ,          NULL,     0);
INSERT INTO nulltest VALUES     ('a',           1,     2,     'c' ,     0.9,            ''  ,          NULL  ,          NULL,     0);
INSERT INTO nulltest VALUES     ('cc'     ,     2,     5,     'cc',     2.00,           'cc',          2.0   ,          'cc',     2);
INSERT INTO nulltest VALUES     ('abcdefg',     3,     NULL,     'cc',     0.09,         'alph',          2     ,          'cc',     1);
INSERT INTO nulltest VALUES     ('b',           4,     10,     'c' ,     1234567.89,     'e' ,          1234.5,          'c' ,     12345);
INSERT INTO nulltest VALUES     ('abcdefg',     5,     15,     'cc',     0.09,           'cc',          2     ,          'cc',     2);
INSERT INTO nulltest VALUES     (NULL,          5,     NULL,     'cc',     0.09,           'cc',          2     ,          'cc',     2);
INSERT INTO nulltest VALUES     (NULL,          7,     NULL,     'cd',     0.10,           'cd',          2     ,          'cc',     2);


SELECT vch7, nint, nint2, rank (vch7, nint, nint2) r from nulltest;

SELECT vch7, nint, nint2, rank (vch7 ASC, nint ASC, nint2 ASC) r from nulltest;

SELECT nnum9, vch5, nsint, rank (nnum9, vch5, nsint) r from nulltest;

SELECT nnum9, vch5, nsint, rank (nnum9 ASC, vch5 ASC, nsint ASC) r from nulltest;

SELECT rank (vch7, nint, nint2) r from nulltest;

SELECT rank (nnum9 ) r from nulltest;

SELECT rank (nnum5 ) r from nulltest;

SELECT rank ( vch5) r from nulltest;

SELECT rank ( vch5) r from nulltest QUALIFY rank ( vch5) >1;

SELECT rank (vch7, nint, nint2) r from nulltest QUALIFY rank (vch7, nint, nint2) <10;


SELECT 
CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END A, 
RANK(CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END) r
FROM nulltest;


SELECT 
CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END A, 
RANK(CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END ASC) r
FROM nulltest;


SELECT nint+ nint2 a ,RANK(nint + nint2) r FROM nulltest;

SELECT RANK(SUBSTRING(VCH7, 1,2)) r FROM nulltest;


--- nullordering with group by

SELECT vch5,vch7, nint, nint2, rank (vch7 ASC, nint ASC, nint2 ASC) r from nulltest GROUP BY vch5;

SELECT vch7,nnum9, vch5, nsint, rank (nnum9, vch5, nsint) r from nulltest group by nint2,vch7;

SELECT vch7,nnum9, vch5, nsint, rank (nnum9 ASC, vch5 ASC, nsint ASC) r from nulltest group by vch7;

SELECT nnum5,rank (vch7, nint, nint2) r from nulltest group by nnum5;

SELECT nnum5,rank (nnum9 ) r from nulltest group by nnum5;

SELECT vch7,rank (nnum5 ) r from nulltest group by vch7;

SELECT vch7,rank ( vch5) r from nulltest group by vch7;

SELECT vch7,rank ( vch5) r from nulltest  group by vch7 QUALIFY rank ( vch5) >1;

SELECT vch5,rank (vch7, nint, nint2) r from nulltest  group by vch5 QUALIFY rank (vch7, nint, nint2) <10;


SELECT vch5,
CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END A, 
RANK(CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END) r
FROM nulltest
group by vch5
QUALIFY RANK(CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END)<10;


SELECT vch5,
CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END A, 
RANK(CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END ASC) r
FROM nulltest
group by vch5
QUALIFY RANK(CASE WHEN nint=1 THEN nint2 WHEN nnum9 >= 1 THEN NULL WHEN VCH5 IS NULL THEN nsint ELSE NULL END ASC)<10;


SELECT vch7,nint+ nint2 a ,RANK(nint + nint2) r FROM nulltest GROUP BY vch7;

SELECT vch5,RANK(SUBSTRING(VCH7, 1,2)) r FROM nulltest GROUP BY vch5;

--more than 2 items in group by list / group by with ordinals

SELECT workgroupnum,sex,paygrade,annualsalary,RANK(workgroupnum,sex,paygrade,annualsalary) TD_RANK1
FROM TDemployee
GROUP BY middleinitial,lastname,firstname;



SELECT  middleinitial,lastname,sex,workgroupnum,RANK(annualsalary) TD_RANK1
FROM TDemployee
GROUP BY middleinitial,lastname,sex,workgroupnum;


SELECT RANK(annualsalary) TD_RANK1
FROM TDemployee
GROUP BY 1,lastname,sex,workgroupnum;



SELECT middleinitial,lastname,sex,workgroupnum,RANK(annualsalary) TD_RANK1
FROM TDemployee
GROUP BY 1,2,sex,workgroupnum;


SELECT middleinitial,lastname,sex,workgroupnum,RANK(annualsalary) TD_RANK1
FROM TDemployee
GROUP BY 8,2,sex,workgroupnum;

CONTROL QUERY DEFAULT COMP_BOOL_200 'OFF';

log ;


DROP TABLE TDemployee;
DROP TABLE TDemp_rank;
DROP TABLE nulltest ;
