github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/window4.tcl (about) 1 ## 2018 May 19 2 # 3 # The author disclaims copyright to this source code. In place of 4 # a legal notice, here is a blessing: 5 # 6 # May you do good and not evil. 7 # May you find forgiveness for yourself and forgive others. 8 # May you share freely, never taking more than you give. 9 # 10 #*********************************************************************** 11 # 12 13 source [file join [file dirname $argv0] pg_common.tcl] 14 15 #========================================================================= 16 17 start_test window4 "2018 June 04" 18 ifcapable !windowfunc 19 20 execsql_test 1.0 { 21 DROP TABLE IF EXISTS t3; 22 CREATE TABLE t3(a TEXT PRIMARY KEY); 23 INSERT INTO t3 VALUES('a'), ('b'), ('c'), ('d'), ('e'); 24 INSERT INTO t3 VALUES('f'), ('g'), ('h'), ('i'), ('j'); 25 } 26 27 for {set i 1} {$i < 20} {incr i} { 28 execsql_test 1.$i "SELECT a, ntile($i) OVER (ORDER BY a) FROM t3" 29 } 30 31 execsql_test 2.0 { 32 DROP TABLE IF EXISTS t4; 33 CREATE TABLE t4(a INTEGER PRIMARY KEY, b TEXT, c INTEGER); 34 INSERT INTO t4 VALUES(1, 'A', 9); 35 INSERT INTO t4 VALUES(2, 'B', 3); 36 INSERT INTO t4 VALUES(3, 'C', 2); 37 INSERT INTO t4 VALUES(4, 'D', 10); 38 INSERT INTO t4 VALUES(5, 'E', 5); 39 INSERT INTO t4 VALUES(6, 'F', 1); 40 INSERT INTO t4 VALUES(7, 'G', 1); 41 INSERT INTO t4 VALUES(8, 'H', 2); 42 INSERT INTO t4 VALUES(9, 'I', 10); 43 INSERT INTO t4 VALUES(10, 'J', 4); 44 } 45 46 execsql_test 2.1 { 47 SELECT a, nth_value(b, c) OVER (ORDER BY a) FROM t4 48 } 49 50 execsql_test 2.2.1 { 51 SELECT a, lead(b) OVER (ORDER BY a) FROM t4 52 } 53 execsql_test 2.2.2 { 54 SELECT a, lead(b, 2) OVER (ORDER BY a) FROM t4 55 } 56 execsql_test 2.2.3 { 57 SELECT a, lead(b, 3, 'abc') OVER (ORDER BY a) FROM t4 58 } 59 60 execsql_test 2.3.1 { 61 SELECT a, lag(b) OVER (ORDER BY a) FROM t4 62 } 63 execsql_test 2.3.2 { 64 SELECT a, lag(b, 2) OVER (ORDER BY a) FROM t4 65 } 66 execsql_test 2.3.3 { 67 SELECT a, lag(b, 3, 'abc') OVER (ORDER BY a) FROM t4 68 } 69 70 execsql_test 2.4.1 { 71 SELECT string_agg(b, '.') OVER ( 72 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 73 ) FROM t4 74 } 75 76 execsql_test 3.0 { 77 DROP TABLE IF EXISTS t5; 78 CREATE TABLE t5(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d INTEGER); 79 INSERT INTO t5 VALUES(1, 'A', 'one', 5); 80 INSERT INTO t5 VALUES(2, 'B', 'two', 4); 81 INSERT INTO t5 VALUES(3, 'A', 'three', 3); 82 INSERT INTO t5 VALUES(4, 'B', 'four', 2); 83 INSERT INTO t5 VALUES(5, 'A', 'five', 1); 84 } 85 86 execsql_test 3.1 { 87 SELECT a, nth_value(c, d) OVER (ORDER BY b) FROM t5 88 } 89 90 execsql_test 3.2 { 91 SELECT a, nth_value(c, d) OVER (PARTITION BY b ORDER BY a) FROM t5 92 } 93 94 execsql_test 3.3 { 95 SELECT a, count(*) OVER abc, count(*) OVER def FROM t5 96 WINDOW abc AS (ORDER BY a), 97 def AS (ORDER BY a DESC) 98 ORDER BY a; 99 } 100 101 execsql_test 3.4 { 102 SELECT a, max(a) FILTER (WHERE (a%2)=0) OVER w FROM t5 103 WINDOW w AS (ORDER BY a) 104 } 105 106 execsql_test 3.5.1 { 107 SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 2 PRECEDING) 108 FROM t5 109 } 110 execsql_test 3.5.2 { 111 SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) 112 FROM t5 113 } 114 execsql_test 3.5.3 { 115 SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING) 116 FROM t5 117 } 118 119 execsql_test 3.6.1 { 120 SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 1 FOLLOWING) 121 FROM t5 122 } 123 execsql_test 3.6.2 { 124 SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) 125 FROM t5 126 } 127 execsql_test 3.6.3 { 128 SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING) 129 FROM t5 130 } 131 132 ========== 133 134 execsql_test 4.0 { 135 DROP TABLE IF EXISTS ttt; 136 CREATE TABLE ttt(a INTEGER PRIMARY KEY, b INTEGER, c INTEGER); 137 INSERT INTO ttt VALUES(1, 1, 1); 138 INSERT INTO ttt VALUES(2, 2, 2); 139 INSERT INTO ttt VALUES(3, 3, 3); 140 141 INSERT INTO ttt VALUES(4, 1, 2); 142 INSERT INTO ttt VALUES(5, 2, 3); 143 INSERT INTO ttt VALUES(6, 3, 4); 144 145 INSERT INTO ttt VALUES(7, 1, 3); 146 INSERT INTO ttt VALUES(8, 2, 4); 147 INSERT INTO ttt VALUES(9, 3, 5); 148 } 149 150 execsql_test 4.1 { 151 SELECT max(c), max(b) OVER (ORDER BY b) FROM ttt GROUP BY b; 152 } 153 154 execsql_test 4.2 { 155 SELECT max(b) OVER (ORDER BY max(c)) FROM ttt GROUP BY b; 156 } 157 158 execsql_test 4.3 { 159 SELECT abs(max(b) OVER (ORDER BY b)) FROM ttt GROUP BY b; 160 } 161 162 execsql_test 4.4 { 163 SELECT sum(b) OVER ( 164 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 165 ) FROM ttt; 166 } 167 168 set lPart [list "PARTITION BY b" "PARTITION BY b, a" "" "PARTITION BY a"] 169 set lOrder [list "ORDER BY a" "ORDER BY a DESC" "" "ORDER BY b, a"] 170 set lRange { 171 "RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW" 172 "RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING" 173 "RANGE BETWEEN CURRENT ROW AND CURRENT ROW" 174 "RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" 175 } 176 177 set lRows { 178 "ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING" 179 "ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING" 180 "ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING" 181 "ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING" 182 "ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING" 183 } 184 185 set tn 1 186 set SQL { 187 SELECT max(c) OVER ($p1 $o1 $r1), 188 min(c) OVER ($p2 $o2 $r2) 189 FROM ttt ORDER BY a 190 } 191 set SQL2 { 192 SELECT sum(c) OVER ($p1 $o1 $r1), 193 sum(c) OVER ($p2 $o2 $r2) 194 FROM ttt ORDER BY a 195 } 196 197 set o1 [lindex $lOrder 0] 198 set o2 [lindex $lOrder 0] 199 set r1 [lindex $lRange 0] 200 set r2 [lindex $lRange 0] 201 foreach p1 $lPart { foreach p2 $lPart { 202 execsql_test 4.5.$tn.1 [subst $SQL] 203 execsql_test 4.5.$tn.2 [subst $SQL2] 204 incr tn 205 }} 206 207 set o1 [lindex $lOrder 0] 208 set o2 [lindex $lOrder 0] 209 set p1 [lindex $lPart 0] 210 set p2 [lindex $lPart 0] 211 foreach r1 $lRange { foreach r2 $lRange { 212 execsql_test 4.5.$tn.1 [subst $SQL] 213 execsql_test 4.5.$tn.2 [subst $SQL2] 214 incr tn 215 }} 216 foreach r1 $lRows { foreach r2 $lRows { 217 execsql_test 4.5.$tn.1 [subst $SQL] 218 execsql_test 4.5.$tn.2 [subst $SQL2] 219 incr tn 220 }} 221 222 set r1 [lindex $lRange 0] 223 set r2 [lindex $lRange 0] 224 set p1 [lindex $lPart 0] 225 set p2 [lindex $lPart 0] 226 foreach o1 $lOrder { foreach o2 $lOrder { 227 execsql_test 4.5.$tn.1 [subst $SQL] 228 execsql_test 4.5.$tn.2 [subst $SQL2] 229 incr tn 230 }} 231 232 ========== 233 234 execsql_test 7.0 { 235 DROP TABLE IF EXISTS t1; 236 CREATE TABLE t1(x INTEGER, y INTEGER); 237 INSERT INTO t1 VALUES(1, 2); 238 INSERT INTO t1 VALUES(3, 4); 239 INSERT INTO t1 VALUES(5, 6); 240 INSERT INTO t1 VALUES(7, 8); 241 INSERT INTO t1 VALUES(9, 10); 242 } 243 244 execsql_test 7.1 { 245 SELECT lead(y) OVER win FROM t1 246 WINDOW win AS (ORDER BY x) 247 } 248 249 execsql_test 7.2 { 250 SELECT lead(y, 2) OVER win FROM t1 251 WINDOW win AS (ORDER BY x) 252 } 253 254 execsql_test 7.3 { 255 SELECT lead(y, 3, -1) OVER win FROM t1 256 WINDOW win AS (ORDER BY x) 257 } 258 259 execsql_test 7.4 { 260 SELECT 261 lead(y) OVER win, lead(y) OVER win 262 FROM t1 263 WINDOW win AS (ORDER BY x) 264 } 265 266 execsql_test 7.5 { 267 SELECT 268 lead(y) OVER win, 269 lead(y, 2) OVER win, 270 lead(y, 3, -1) OVER win 271 FROM t1 272 WINDOW win AS (ORDER BY x) 273 } 274 275 ========== 276 277 execsql_test 8.0 { 278 DROP TABLE IF EXISTS t1; 279 CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER, d INTEGER); 280 INSERT INTO t1 VALUES(1, 2, 3, 4); 281 INSERT INTO t1 VALUES(5, 6, 7, 8); 282 INSERT INTO t1 VALUES(9, 10, 11, 12); 283 } 284 285 execsql_test 8.1 { 286 SELECT row_number() OVER win, 287 nth_value(d,2) OVER win, 288 lead(d) OVER win 289 FROM t1 290 WINDOW win AS (ORDER BY a) 291 } 292 293 execsql_test 8.2 { 294 SELECT row_number() OVER win, 295 rank() OVER win, 296 dense_rank() OVER win, 297 ntile(2) OVER win, 298 first_value(d) OVER win, 299 last_value(d) OVER win, 300 nth_value(d,2) OVER win, 301 lead(d) OVER win, 302 lag(d) OVER win, 303 max(d) OVER win, 304 min(d) OVER win 305 FROM t1 306 WINDOW win AS (ORDER BY a) 307 } 308 309 ========== 310 311 execsql_test 9.0 { 312 DROP TABLE IF EXISTS t2; 313 CREATE TABLE t2(x INTEGER); 314 INSERT INTO t2 VALUES(1), (1), (1), (4), (4), (6), (7); 315 } 316 317 execsql_test 9.1 { 318 SELECT rank() OVER () FROM t2 319 } 320 execsql_test 9.2 { 321 SELECT dense_rank() OVER (PARTITION BY x) FROM t2 322 } 323 execsql_float_test 9.3 { 324 SELECT x, percent_rank() OVER (PARTITION BY x ORDER BY x) FROM t2 325 } 326 327 execsql_test 9.4 { 328 SELECT x, rank() OVER (ORDER BY x) FROM t2 ORDER BY 1,2 329 } 330 331 execsql_test 9.5 { 332 SELECT DISTINCT x, rank() OVER (ORDER BY x) FROM t2 ORDER BY 1,2 333 } 334 335 execsql_float_test 9.6 { 336 SELECT percent_rank() OVER () FROM t1 337 } 338 339 execsql_float_test 9.7 { 340 SELECT cume_dist() OVER () FROM t1 341 } 342 343 execsql_test 10.0 { 344 DROP TABLE IF EXISTS t7; 345 CREATE TABLE t7(id INTEGER PRIMARY KEY, a INTEGER, b INTEGER); 346 INSERT INTO t7(id, a, b) VALUES 347 (1, 1, 2), (2, 1, NULL), (3, 1, 4), 348 (4, 3, NULL), (5, 3, 8), (6, 3, 1); 349 } 350 execsql_test 10.1 { 351 SELECT id, min(b) OVER (PARTITION BY a ORDER BY id) FROM t7; 352 } 353 354 execsql_test 10.2 { 355 SELECT id, lead(b, -1) OVER (PARTITION BY a ORDER BY id) FROM t7; 356 } 357 execsql_test 10.3 { 358 SELECT id, lag(b, -1) OVER (PARTITION BY a ORDER BY id) FROM t7; 359 } 360 361 execsql_test 11.0 { 362 DROP VIEW IF EXISTS v8; 363 DROP TABLE IF EXISTS t8; 364 CREATE TABLE t8(t INT, total INT); 365 INSERT INTO t8 VALUES(0,2); 366 INSERT INTO t8 VALUES(5,1); 367 INSERT INTO t8 VALUES(10,1); 368 } 369 370 execsql_test 11.1 { 371 SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8; 372 } 373 374 execsql_test 11.2 { 375 CREATE VIEW v8 AS SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8; 376 } 377 378 execsql_test 11.3 { 379 SELECT * FROM v8; 380 } 381 382 execsql_test 11.4 { 383 SELECT * FROM ( 384 SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8 385 ) sub; 386 } 387 388 execsql_test 11.5 { 389 SELECT sum( min(t) ) OVER () FROM t8 GROUP BY total; 390 } 391 execsql_test 11.5 { 392 SELECT sum( max(t) ) OVER () FROM t8 GROUP BY total; 393 } 394 395 execsql_test 11.7 { 396 SELECT sum( min(t) ) OVER () FROM t8; 397 } 398 execsql_test 11.8 { 399 SELECT sum( max(t) ) OVER () FROM t8; 400 } 401 402 execsql_test 12.0 { 403 DROP TABLE IF EXISTS t2; 404 CREATE TABLE t2(a INTEGER); 405 INSERT INTO t2 VALUES(1), (2), (3); 406 } 407 408 execsql_test 12.1 { 409 SELECT (SELECT min(a) OVER ()) FROM t2 410 } 411 412 execsql_float_test 12.2 { 413 SELECT (SELECT avg(a)) FROM t2 ORDER BY 1 414 } 415 416 execsql_float_test 12.3 { 417 SELECT 418 (SELECT avg(a) UNION SELECT min(a) OVER ()) 419 FROM t2 GROUP BY a 420 ORDER BY 1 421 } 422 423 finish_test 424