# name: test/sql/window/test_nthvalue.test # description: Most basic window function # group: [window] statement ok SET default_null_order='nulls_first'; statement ok PRAGMA enable_verification statement ok CREATE TABLE empsalary (depname varchar, empno bigint, salary int, enroll_date date); statement ok INSERT INTO empsalary VALUES ('develop', 10, 5200, '2007-08-01'), ('sales', 1, 5000, '2006-10-01'), ('personnel', 5, 3500, '2007-12-10'), ('sales', 4, 4800, '2007-08-08'), ('personnel', 2, 3900, '2006-12-23'), ('develop', 7, 4200, '2008-01-01'), ('develop', 9, 4500, '2008-01-01'), ('sales', 3, 4800, '2007-08-01'), ('develop', 8, 6000, '2006-10-01'), ('develop', 11, 5200, '2007-08-15'); # nth_value query III SELECT depname, empno, nth_value(empno, 2) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ORDER BY 1, 2 ---- develop 7 8 develop 8 9 develop 9 10 develop 10 11 develop 11 NULL personnel 2 5 personnel 5 NULL sales 1 3 sales 3 4 sales 4 NULL # Where either of the the parameters is a constant NULL query III SELECT depname, empno, nth_value(empno, NULL) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ORDER BY 1, 2 ---- develop 7 NULL develop 8 NULL develop 9 NULL develop 10 NULL develop 11 NULL personnel 2 NULL personnel 5 NULL sales 1 NULL sales 3 NULL sales 4 NULL query III SELECT depname, empno, nth_value(NULL, 2) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ORDER BY 1, 2 ---- develop 7 NULL develop 8 NULL develop 9 NULL develop 10 NULL develop 11 NULL personnel 2 NULL personnel 5 NULL sales 1 NULL sales 3 NULL sales 4 NULL # Where either of the parameters is a column that contains NULL values query III SELECT depname, empno, nth_value(empno, case empno % 3 when 1 then 2 else NULL end) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ORDER BY 1, 2 ---- develop 7 8 develop 8 NULL develop 9 NULL develop 10 11 develop 11 NULL personnel 2 NULL personnel 5 NULL sales 1 3 sales 3 NULL sales 4 NULL statement ok CREATE VIEW empno_nulls AS SELECT depname, case empno % 2 when 1 then empno else NULL end as empno, salary, enroll_date FROM empsalary query III SELECT depname, empno, nth_value(empno, 2) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empno_nulls ORDER BY 1, 2, 3 ---- develop NULL NULL develop NULL 7 develop 7 9 develop 9 11 develop 11 NULL personnel NULL 5 personnel 5 NULL sales NULL 1 sales 1 3 sales 3 NULL # Where the second parameter (offset) is not a constant query IIII SELECT depname, empno, 1 + empno %3 as offset, nth_value(empno, 1 + empno %3) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ORDER BY 1, 2 ---- develop 7 2 8 develop 8 3 10 develop 9 1 9 develop 10 2 11 develop 11 3 NULL personnel 2 3 NULL personnel 5 3 NULL sales 1 2 3 sales 3 1 3 sales 4 2 NULL # Where the second parameter (offset) can be zero (coverage) query IIII SELECT depname, empno, empno %3 as offset, nth_value(empno, empno %3) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ORDER BY 1, 2 ---- develop 7 1 7 develop 8 2 9 develop 9 0 NULL develop 10 1 10 develop 11 2 NULL personnel 2 2 5 personnel 5 2 NULL sales 1 1 1 sales 3 0 NULL sales 4 1 4 # Where the first parameter is a constant query III SELECT depname, empno, nth_value(-1, 2) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ORDER BY 1, 2 ---- develop 7 -1 develop 8 -1 develop 9 -1 develop 10 -1 develop 11 NULL personnel 2 -1 personnel 5 NULL sales 1 -1 sales 3 -1 sales 4 NULL statement error SELECT depname, empno, nth_value(empno) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ---- statement error SELECT depname, empno, nth_value(empno, 2, 3) OVER ( PARTITION BY depname ORDER BY empno ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) fv FROM empsalary ----