# Test of SQL window functions NTH_VALUE # ---------------------------------------------------------------------- SET NAMES utf8; Warnings: Warning 3719 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous. SELECT NTH_VALUE(6,1) OVER (); NTH_VALUE(6,1) OVER () 6 SELECT NTH_VALUE(NULL,1) OVER (); NTH_VALUE(NULL,1) OVER () NULL SELECT NTH_VALUE(6,2) OVER (); NTH_VALUE(6,2) OVER () NULL SELECT NTH_VALUE(6,1) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW); NTH_VALUE(6,1) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 6 SELECT NTH_VALUE(NULL,1) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW); NTH_VALUE(NULL,1) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) NULL SELECT NTH_VALUE(6,2) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW); NTH_VALUE(6,2) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) NULL CREATE TABLE t1 (d DOUBLE, id INT, sex CHAR(1)); INSERT INTO t1 VALUES (1.0, 1, 'M'), (2.0, 2, 'F'), (3.0, 3, 'F'), (4.0, 4, 'F'), (5.0, 5, 'M'), (NULL, NULL, 'M'), (10.0, 10, NULL), (10.0, 10, NULL), (11.0, 11, NULL); not supported SELECT id, sex, NTH_VALUE(id, 1) FROM LAST OVER () FROM t1; ERROR 42000: This version of MySQL doesn't yet support 'FROM LAST' ok SELECT id, sex, NTH_VALUE(id, 1) FROM FIRST OVER () FROM t1; id sex NTH_VALUE(id, 1) FROM FIRST OVER () 1 M 1 2 F 1 3 F 1 4 F 1 5 M 1 NULL M 1 10 NULL 1 10 NULL 1 11 NULL 1 SELECT id, sex, NTH_VALUE(id, 1) IGNORE NULLS OVER () FROM t1; ERROR 42000: This version of MySQL doesn't yet support 'IGNORE NULLS' SELECT id, sex, NTH_VALUE(id, 1.2) OVER () FROM t1; ERROR HY000: Incorrect arguments to nth_value SELECT id, sex, NTH_VALUE(id, 'a') OVER () FROM t1; ERROR HY000: Incorrect arguments to nth_value SELECT id, sex, NTH_VALUE(id, -3) OVER () le1 FROM t1; ERROR HY000: Incorrect arguments to nth_value NULL argument is OK SELECT id, sex, NTH_VALUE(id, NULL) OVER () FROM t1; id sex NTH_VALUE(id, NULL) OVER () 1 M NULL 2 F NULL 3 F NULL 4 F NULL 5 M NULL NULL M NULL 10 NULL NULL 10 NULL NULL 11 NULL NULL PREPARE p FROM "SELECT id, sex, NTH_VALUE(id, ?) OVER () FROM t1"; SET @p1= 3; EXECUTE p USING @p1; id sex NTH_VALUE(id, ?) OVER () 1 M 3 2 F 3 3 F 3 4 F 3 5 M 3 NULL M 3 10 NULL 3 10 NULL 3 11 NULL 3 SET @p1= NULL; EXECUTE p USING @p1; id sex NTH_VALUE(id, ?) OVER () 1 M NULL 2 F NULL 3 F NULL 4 F NULL 5 M NULL NULL M NULL 10 NULL NULL 10 NULL NULL 11 NULL NULL SET @p1= '1'; EXECUTE p USING @p1; ERROR HY000: Incorrect arguments to nth_value SET @p1= 1.2; EXECUTE p USING @p1; ERROR HY000: Incorrect arguments to nth_value DROP PREPARE p; Ok, default semantics: SELECT id, sex, NTH_VALUE(id, 1) RESPECT NULLS OVER () FROM t1; id sex NTH_VALUE(id, 1) RESPECT NULLS OVER () 1 M 1 2 F 1 3 F 1 4 F 1 5 M 1 NULL M 1 10 NULL 1 10 NULL 1 11 NULL 1 SELECT id, sex, NTH_VALUE(NULL, 1) RESPECT NULLS OVER () FROM t1; id sex NTH_VALUE(NULL, 1) RESPECT NULLS OVER () 1 M NULL 2 F NULL 3 F NULL 4 F NULL 5 M NULL NULL M NULL 10 NULL NULL 10 NULL NULL 11 NULL NULL SELECT id, sex, NTH_VALUE(id+100, 1) RESPECT NULLS OVER () FROM t1; id sex NTH_VALUE(id+100, 1) RESPECT NULLS OVER () 1 M 101 2 F 101 3 F 101 4 F 101 5 M 101 NULL M 101 10 NULL 101 10 NULL 101 11 NULL 101 SELECT id, sex, NTH_VALUE(100, 1) RESPECT NULLS OVER () FROM t1; id sex NTH_VALUE(100, 1) RESPECT NULLS OVER () 1 M 100 2 F 100 3 F 100 4 F 100 5 M 100 NULL M 100 10 NULL 100 10 NULL 100 11 NULL 100 SELECT id, sex, NTH_VALUE(100, 100) RESPECT NULLS OVER () FROM t1; id sex NTH_VALUE(100, 100) RESPECT NULLS OVER () 1 M NULL 2 F NULL 3 F NULL 4 F NULL 5 M NULL NULL M NULL 10 NULL NULL 10 NULL NULL 11 NULL NULL static wf SELECT id, sex, NTH_VALUE(id, 1) OVER () FROM t1; id sex NTH_VALUE(id, 1) OVER () 1 M 1 2 F 1 3 F 1 4 F 1 5 M 1 NULL M 1 10 NULL 1 10 NULL 1 11 NULL 1 SELECT id, sex, NTH_VALUE(id, 3) OVER () FROM t1; id sex NTH_VALUE(id, 3) OVER () 1 M 3 2 F 3 3 F 3 4 F 3 5 M 3 NULL M 3 10 NULL 3 10 NULL 3 11 NULL 3 SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (PARTITION BY sex ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING); id sex NTH_VALUE(id, 2) OVER w 10 NULL 10 10 NULL 10 11 NULL 10 2 F 3 3 F 3 4 F 3 NULL M 1 1 M 1 5 M 1 SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (PARTITION BY id ORDER BY sex ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING); id sex NTH_VALUE(id, 2) OVER w NULL M NULL 1 M NULL 2 F NULL 3 F NULL 4 F NULL 5 M NULL 10 NULL 10 10 NULL 10 11 NULL NULL unbuffered SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY ID ROWS UNBOUNDED PRECEDING); id sex NTH_VALUE(id, 2) OVER w 10 NULL NULL 10 NULL 10 11 NULL 10 2 F NULL 3 F 3 4 F 3 NULL M NULL 1 M 1 5 M 1 SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY ID RANGE UNBOUNDED PRECEDING); id sex NTH_VALUE(id, 2) OVER w 10 NULL 10 10 NULL 10 11 NULL 10 2 F NULL 3 F 3 4 F 3 NULL M NULL 1 M 1 5 M 1 test unoptimized path: trick: add DOUBLE type w/SUM which is unoptimized by default ascending SELECT d, SUM(d) OVER w, sex, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY D ROWS 2 PRECEDING); d SUM(d) OVER w sex NTH_VALUE(d, 2) OVER w 10 10 NULL NULL 10 20 NULL 10 11 31 NULL 10 2 2 F NULL 3 5 F 3 4 9 F 3 NULL NULL M NULL 1 1 M 1 5 6 M 1 SELECT d, SUM(d) OVER w, sex, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY D RANGE 2 PRECEDING); d SUM(d) OVER w sex NTH_VALUE(d, 2) OVER w 10 20 NULL 10 10 20 NULL 10 11 31 NULL 10 2 2 F NULL 3 5 F 3 4 9 F 3 NULL NULL M NULL 1 1 M NULL 5 5 M NULL SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D ROWS 2 PRECEDING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w NULL NULL 1 NULL 1 1 2 1 2 3 3 1 3 6 3 2 4 9 3 3 5 12 3 4 10 19 3 5 10 25 3 10 11 31 3 10 SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D ASC ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w NULL NULL 0 NULL 1 NULL 1 NULL 2 1 2 1 3 3 2 2 4 5 2 3 5 7 2 4 10 9 2 5 10 15 2 10 11 20 2 10 SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D ASC ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w NULL 3 2 2 1 5 2 3 2 7 2 4 3 9 2 5 4 15 2 10 5 20 2 10 10 21 2 11 10 11 1 NULL 11 NULL 0 NULL SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D RANGE 2 PRECEDING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w NULL NULL 1 NULL 1 1 1 NULL 2 3 2 2 3 6 3 2 4 9 3 3 5 12 3 4 10 20 2 10 10 20 2 10 11 31 3 10 SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w NULL NULL 1 NULL 1 3 2 2 2 6 3 2 3 9 3 3 4 12 3 4 5 9 2 5 10 31 3 10 10 31 3 10 11 31 3 10 SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w NULL NULL 1 NULL 1 5 2 3 2 7 2 4 3 9 2 5 4 5 1 NULL 5 NULL 0 NULL 10 11 1 NULL 10 11 1 NULL 11 NULL 0 NULL descending SELECT d, SUM(d) OVER w, sex, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY D DESC ROWS 2 PRECEDING); d SUM(d) OVER w sex NTH_VALUE(d, 2) OVER w 11 11 NULL NULL 10 21 NULL 10 10 31 NULL 10 4 4 F NULL 3 7 F 3 2 9 F 3 5 5 M NULL 1 6 M 1 NULL 6 M 1 SELECT d, SUM(d) OVER w, sex, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY D DESC RANGE 2 PRECEDING); d SUM(d) OVER w sex NTH_VALUE(d, 2) OVER w 11 11 NULL NULL 10 31 NULL 10 10 31 NULL 10 4 4 F NULL 3 7 F 3 2 9 F 3 5 5 M NULL 1 1 M NULL NULL NULL M NULL SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D DESC ROWS 2 PRECEDING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w 11 11 1 NULL 10 21 2 10 10 31 3 10 5 25 3 10 4 19 3 5 3 12 3 4 2 9 3 3 1 6 3 2 NULL 3 3 1 SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D DESC ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w 11 NULL 0 NULL 10 11 1 NULL 10 21 2 10 5 20 2 10 4 15 2 5 3 9 2 4 2 7 2 3 1 5 2 2 NULL 3 2 1 SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D DESC ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w 11 20 2 10 10 15 2 5 10 9 2 4 5 7 2 3 4 5 2 2 3 3 2 1 2 1 2 NULL 1 NULL 1 NULL NULL NULL 0 NULL SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D DESC RANGE 2 PRECEDING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w 11 11 1 NULL 10 31 3 10 10 31 3 10 5 5 1 NULL 4 9 2 4 3 12 3 4 2 9 3 3 1 6 3 2 NULL NULL 1 NULL SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w 11 31 3 10 10 31 3 10 10 31 3 10 5 9 2 4 4 12 3 4 3 9 3 3 2 6 3 2 1 3 2 1 NULL NULL 1 NULL SELECT d, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(d, 2) OVER w FROM t1 WINDOW w as (ORDER BY D DESC RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING); d SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(d, 2) OVER w 11 20 2 10 10 NULL 0 NULL 10 NULL 0 NULL 5 7 2 3 4 5 2 2 3 3 2 1 2 1 1 NULL 1 NULL 0 NULL NULL NULL 1 NULL Dynamic upper SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY id); id sex NTH_VALUE(id, 2) OVER w NULL M NULL 1 M 1 2 F 1 3 F 1 4 F 1 5 M 1 10 NULL 1 10 NULL 1 11 NULL 1 optimized path ascending SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY ID ROWS 2 PRECEDING); id sex NTH_VALUE(id, 2) OVER w 10 NULL NULL 10 NULL 10 11 NULL 10 2 F NULL 3 F 3 4 F 3 NULL M NULL 1 M 1 5 M 1 SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY ID RANGE 2 PRECEDING); id sex NTH_VALUE(id, 2) OVER w 10 NULL 10 10 NULL 10 11 NULL 10 2 F NULL 3 F 3 4 F 3 NULL M NULL 1 M NULL 5 M NULL SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID ROWS 2 PRECEDING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w NULL 1 NULL 1 2 1 2 3 1 3 3 2 4 3 3 5 3 4 10 3 5 10 3 10 11 3 10 SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID ASC ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w NULL 0 NULL 1 1 NULL 2 2 1 3 2 2 4 2 3 5 2 4 10 2 5 10 2 10 11 2 10 SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID ASC ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w NULL 2 2 1 2 3 2 2 4 3 2 5 4 2 10 5 2 10 10 2 11 10 1 NULL 11 0 NULL SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID RANGE 2 PRECEDING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w NULL 1 NULL 1 1 NULL 2 2 2 3 3 2 4 3 3 5 3 4 10 2 10 10 2 10 11 3 10 SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w NULL 1 NULL 1 2 2 2 3 2 3 3 3 4 3 4 5 2 5 10 3 10 10 3 10 11 3 10 SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w NULL 1 NULL 1 2 3 2 2 4 3 2 5 4 1 NULL 5 0 NULL 10 1 NULL 10 1 NULL 11 0 NULL descending SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY ID DESC ROWS 2 PRECEDING); id sex NTH_VALUE(id, 2) OVER w 11 NULL NULL 10 NULL 10 10 NULL 10 4 F NULL 3 F 3 2 F 3 5 M NULL 1 M 1 NULL M 1 SELECT id, sex, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (PARTITION BY SEX ORDER BY ID DESC RANGE 2 PRECEDING); id sex NTH_VALUE(id, 2) OVER w 11 NULL NULL 10 NULL 10 10 NULL 10 4 F NULL 3 F 3 2 F 3 5 M NULL 1 M NULL NULL M NULL SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID DESC ROWS 2 PRECEDING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w 11 1 NULL 10 2 10 10 3 10 5 3 10 4 3 5 3 3 4 2 3 3 1 3 2 NULL 3 1 SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID DESC ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w 11 0 NULL 10 1 NULL 10 2 10 5 2 10 4 2 5 3 2 4 2 2 3 1 2 2 NULL 2 1 SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID DESC ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w 11 2 10 10 2 5 10 2 4 5 2 3 4 2 2 3 2 1 2 2 NULL 1 1 NULL NULL 0 NULL SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID DESC RANGE 2 PRECEDING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w 11 1 NULL 10 3 10 10 3 10 5 1 NULL 4 2 4 3 3 4 2 3 3 1 3 2 NULL 1 NULL SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w 11 3 10 10 3 10 10 3 10 5 2 4 4 3 4 3 3 3 2 3 2 1 2 1 NULL 1 NULL SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w as (ORDER BY ID DESC RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING); id COUNT(*) OVER w NTH_VALUE(id, 2) OVER w 11 2 10 10 0 NULL 10 0 NULL 5 2 3 4 2 2 3 2 1 2 1 NULL 1 0 NULL NULL 1 NULL many nth_value calls on one window, optimized path SELECT id, COUNT(*) OVER w, NTH_VALUE(id, 3) OVER w, FIRST_VALUE(id) OVER w, NTH_VALUE(id, 1) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w AS (ORDER BY id ASC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW); id COUNT(*) OVER w NTH_VALUE(id, 3) OVER w FIRST_VALUE(id) OVER w NTH_VALUE(id, 1) OVER w NTH_VALUE(id, 2) OVER w NULL 1 NULL NULL NULL NULL 1 2 NULL NULL NULL 1 2 3 2 NULL NULL 1 3 3 3 1 1 2 4 3 4 2 2 3 5 3 5 3 3 4 10 3 10 4 4 5 10 3 10 5 5 10 11 3 11 10 10 10 many nth_value calls on one window, unoptimized path SELECT id, SUM(d) OVER w, COUNT(*) OVER w, NTH_VALUE(id, 3) OVER w, FIRST_VALUE(id) OVER w, NTH_VALUE(id, 1) OVER w, NTH_VALUE(id, 2) OVER w FROM t1 WINDOW w AS (ORDER BY id ASC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW); id SUM(d) OVER w COUNT(*) OVER w NTH_VALUE(id, 3) OVER w FIRST_VALUE(id) OVER w NTH_VALUE(id, 1) OVER w NTH_VALUE(id, 2) OVER w NULL NULL 1 NULL NULL NULL NULL 1 1 2 NULL NULL NULL 1 2 3 3 2 NULL NULL 1 3 6 3 3 1 1 2 4 9 3 4 2 2 3 5 12 3 5 3 3 4 10 19 3 10 4 4 5 10 25 3 10 5 5 10 11 31 3 11 10 10 10 DROP TABLE t1; Bug#25835149 SET @savmode=@@SESSION.SQL_MODE; SET SESSION SQL_MODE=''; CREATE TABLE `test`( `pk` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `dt` DATETIME DEFAULT NULL, `ge` GEOMETRY DEFAULT NULL ); Warnings: Warning 1681 Integer display width is deprecated and will be removed in a future release. INSERT INTO `test` VALUES (1, '2007-05-08 12:10:55', ST_GeomFromText('POINT(1 1)')), (2, NULL, NULL), (3, NULL, NULL), (4, '2001-01-18 00:00:00', ST_GeomFromText('POINT(4 4)')), (5, '2009-11-24 00:00:00', ST_GeomFromText('POINT(5 5)')), (6, '2001-11-22 21:41:15', ST_GeomFromText('POINT(6 6)')), (7, NULL, NULL), (8, '0000-00-00 00:00:00', ST_GeomFromText('POINT(8 8)')), (9, '2003-05-13 18:03:04', ST_GeomFromText('POINT(9 9)')), (10, '2008-04-15 09:44:20', ST_GeomFromText('POINT(10 10)')), (11, '2009-07-15 00:00:00', ST_GeomFromText('POINT(11 11)')), (12, '2007-04-27 13:53:37', ST_GeomFromText('POINT(12 12)')), (13, '0000-00-00 00:00:00', ST_GeomFromText('POINT(13 13)')), (14, '2000-02-02 02:15:28', ST_GeomFromText('POINT(14 14)')), (15, '2004-06-06 00:00:00', ST_GeomFromText('POINT(15 15)')), (16, NULL, NULL), (17, '2002-06-21 00:00:00', ST_GeomFromText('POINT(17 17)')), (18, '2007-03-23 00:00:00', ST_GeomFromText('POINT(18 18)')), (19, '2006-10-06 00:00:00', ST_GeomFromText('POINT(19 19)')), (20, '2008-07-07 00:00:00', ST_GeomFromText('POINT(20 20)')); SELECT dt, NTH_VALUE(dt, 3) OVER w1 nth, CAST(NTH_VALUE(ge, 3) OVER w1 AS JSON) ge FROM test WHERE `pk` = 2 WINDOW w1 AS (); dt nth ge NULL NULL NULL SELECT dt, NTH_VALUE(dt, 3) OVER w1 nth, CAST(NTH_VALUE(ge, 3) OVER w1 AS JSON) ge FROM test WHERE `pk` > 3 WINDOW w1 AS (); dt nth ge 2001-01-18 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2009-11-24 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2001-11-22 21:41:15 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} NULL 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 0000-00-00 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2003-05-13 18:03:04 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2008-04-15 09:44:20 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2009-07-15 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2007-04-27 13:53:37 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 0000-00-00 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2000-02-02 02:15:28 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2004-06-06 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} NULL 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2002-06-21 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2007-03-23 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2006-10-06 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} 2008-07-07 00:00:00 2001-11-22 21:41:15 {"type": "Point", "coordinates": [6.0, 6.0]} SELECT dt, NTH_VALUE(CAST(dt AS TIME), 3) OVER w1 FROM test WHERE `pk` > 3 WINDOW w1 AS (); dt NTH_VALUE(CAST(dt AS TIME), 3) OVER w1 2001-01-18 00:00:00 21:41:15 2009-11-24 00:00:00 21:41:15 2001-11-22 21:41:15 21:41:15 NULL 21:41:15 0000-00-00 00:00:00 21:41:15 2003-05-13 18:03:04 21:41:15 2008-04-15 09:44:20 21:41:15 2009-07-15 00:00:00 21:41:15 2007-04-27 13:53:37 21:41:15 0000-00-00 00:00:00 21:41:15 2000-02-02 02:15:28 21:41:15 2004-06-06 00:00:00 21:41:15 NULL 21:41:15 2002-06-21 00:00:00 21:41:15 2007-03-23 00:00:00 21:41:15 2006-10-06 00:00:00 21:41:15 2008-07-07 00:00:00 21:41:15 SET SESSION SQL_MODE=@savmode; DROP TABLE `test`; Bug with missing update of cached example after split_sum_func for NTH_VALUE CREATE TABLE t(a INT, b INT, c INT, d INT); INSERT INTO t VALUES (1,1,1,1), (2,2,4,2), (3,3,9,3); SELECT SUM(c/d), NTH_VALUE(SUM(c/d),1) OVER (ORDER BY a) FROM t GROUP BY a,b; SUM(c/d) NTH_VALUE(SUM(c/d),1) OVER (ORDER BY a) 1.0000 1.0000 2.0000 1.0000 3.0000 1.0000 SELECT NTH_VALUE(SUM(c/d), 3) OVER (ORDER BY a) FROM t GROUP BY a,b; NTH_VALUE(SUM(c/d), 3) OVER (ORDER BY a) NULL NULL 3.0000 SELECT 1+NTH_VALUE(SUM(c/d), 1) OVER (ORDER BY a) FROM t GROUP BY a,b; 1+NTH_VALUE(SUM(c/d), 1) OVER (ORDER BY a) 2.0000 2.0000 2.0000 SELECT ROW_NUMBER() OVER () rn, 1+NTH_VALUE(SUM(c/d), 1) OVER (ORDER BY a) plus_fv, 1+NTH_VALUE(SUM(c/d), 2) OVER (ORDER BY a) plus_lv FROM t GROUP BY a,b; rn plus_fv plus_lv 1 2.0000 NULL 2 2.0000 3.0000 3 2.0000 3.0000 DROP TABLE t; # # Bug#26740557: WINDOW FUNC + JSON: ASSERTION FAILED: # FALSE IN ITEM::VAL_JSON # SELECT ((MAKETIME(((QUARTER('| !*c>*{/'))<=> (NTH_VALUE(JSON_OBJECTAGG('key4',0x067c13d0d0d7d8c8d768aef7) ,1)OVER())),'9236-05-27',0xe2a7d4))^(0x1109)); ((MAKETIME(((QUARTER('| !*c>*{/'))<=> (NTH_VALUE(JSON_OBJECTAGG('key4',0x067c13d0d0d7d8c8d768aef7) ,1)OVER())),'9236-05-27',0xe2a7d4))^(0x1109)) NULL Warnings: Warning 1292 Incorrect datetime value: '| !*c>*{/' Warning 1292 Incorrect datetime value: '| !*c>*{/' Warning 1292 Truncated incorrect INTEGER value: '9236-05-27' SELECT ((NTH_VALUE(JSON_MERGE_PATCH(1.755913e+308,'{ }'),246)OVER())<=(1)); ((NTH_VALUE(JSON_MERGE_PATCH(1.755913e+308,'{ }'),246)OVER())<=(1)) NULL SELECT ((NTH_VALUE(JSON_MERGE_PATCH(1.755913e+308,'{ }'),1)OVER())<=(1)); ERROR 22032: Invalid data type for JSON data in argument 1 to function json_merge_patch; a JSON string or JSON type is required. SELECT ((QUOTE(JSON_KEYS(NTH_VALUE(JSON_KEYS(EXP(-15676),ABS('d0')), 162)OVER())))>=(CONNECTION_ID())); ((QUOTE(JSON_KEYS(NTH_VALUE(JSON_KEYS(EXP(-15676),ABS('d0')), 162)OVER())))>=(CONNECTION_ID())) 0 SELECT ((QUOTE(JSON_KEYS(NTH_VALUE(JSON_KEYS(EXP(-15676),ABS('d0')), 1)OVER())))>=(CONNECTION_ID())); ERROR 22032: Invalid data type for JSON data in argument 1 to function json_keys; a JSON string or JSON type is required. SELECT JSON_LENGTH(NTH_VALUE(JSON_OBJECTAGG('key2','*B'),172)OVER()); JSON_LENGTH(NTH_VALUE(JSON_OBJECTAGG('key2','*B'),172)OVER()) NULL SELECT JSON_LENGTH(NTH_VALUE(JSON_OBJECTAGG('key2','*B'),1)OVER()); JSON_LENGTH(NTH_VALUE(JSON_OBJECTAGG('key2','*B'),1)OVER()) 1 # End of test for Bug#26740557