github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/window2.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  
    18  start_test window2 "2018 May 19"
    19  
    20  ifcapable !windowfunc
    21  
    22  execsql_test 1.0 {
    23    DROP TABLE IF EXISTS t1;
    24    CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d INTEGER);
    25    INSERT INTO t1 VALUES(1, 'odd',  'one',   1);
    26    INSERT INTO t1 VALUES(2, 'even', 'two',   2);
    27    INSERT INTO t1 VALUES(3, 'odd',  'three', 3);
    28    INSERT INTO t1 VALUES(4, 'even', 'four',  4);
    29    INSERT INTO t1 VALUES(5, 'odd',  'five',  5);
    30    INSERT INTO t1 VALUES(6, 'even', 'six',   6);
    31  }
    32  
    33  execsql_test 1.1 {
    34    SELECT c, sum(d) OVER (PARTITION BY b ORDER BY c) FROM t1;
    35  }
    36  
    37  execsql_test 1.2 {
    38    SELECT sum(d) OVER () FROM t1;
    39  }
    40  
    41  execsql_test 1.3 {
    42    SELECT sum(d) OVER (PARTITION BY b) FROM t1;
    43  }
    44  
    45  ==========
    46  execsql_test 2.1 {
    47    SELECT a, sum(d) OVER (
    48      ORDER BY d
    49      ROWS BETWEEN 1000 PRECEDING AND 1 FOLLOWING
    50    ) FROM t1
    51  }
    52  execsql_test 2.2 {
    53    SELECT a, sum(d) OVER (
    54      ORDER BY d
    55      ROWS BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
    56    ) FROM t1
    57  }
    58  execsql_test 2.3 {
    59    SELECT a, sum(d) OVER (
    60      ORDER BY d
    61      ROWS BETWEEN 1 PRECEDING AND 1000 FOLLOWING
    62    ) FROM t1
    63  }
    64  execsql_test 2.4 {
    65    SELECT a, sum(d) OVER (
    66      ORDER BY d
    67      ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
    68    ) FROM t1
    69  }
    70  execsql_test 2.5 {
    71    SELECT a, sum(d) OVER (
    72      ORDER BY d
    73      ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING
    74    ) FROM t1
    75  }
    76  
    77  execsql_test 2.6 {
    78    SELECT a, sum(d) OVER (
    79      PARTITION BY b
    80      ORDER BY d 
    81      ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
    82    ) FROM t1
    83  }
    84  
    85  execsql_test 2.7 {
    86    SELECT a, sum(d) OVER (
    87      PARTITION BY b
    88      ORDER BY d 
    89      ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING
    90    ) FROM t1
    91  }
    92  
    93  execsql_test 2.8 {
    94    SELECT a, sum(d) OVER (
    95      ORDER BY d 
    96      ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
    97    ) FROM t1
    98  }
    99  
   100  execsql_test 2.9 {
   101    SELECT a, sum(d) OVER (
   102      ORDER BY d 
   103      ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING
   104    ) FROM t1
   105  }
   106  
   107  execsql_test 2.10 {
   108    SELECT a, sum(d) OVER (
   109      ORDER BY d 
   110      ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
   111    ) FROM t1
   112  }
   113  
   114  execsql_test 2.11 {
   115    SELECT a, sum(d) OVER (
   116      ORDER BY d 
   117      ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
   118    ) FROM t1
   119  }
   120  
   121  execsql_test 2.13 {
   122    SELECT a, sum(d) OVER (
   123      ORDER BY d 
   124      ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING
   125    ) FROM t1
   126  }
   127  
   128  execsql_test 2.14 {
   129    SELECT a, sum(d) OVER (
   130      ORDER BY d 
   131      ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING
   132    ) FROM t1
   133  }
   134  
   135  execsql_test 2.15 {
   136    SELECT a, sum(d) OVER (
   137      PARTITION BY b
   138      ORDER BY d 
   139      ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING
   140    ) FROM t1
   141  }
   142  
   143  execsql_test 2.16 {
   144    SELECT a, sum(d) OVER (
   145      PARTITION BY b
   146      ORDER BY d 
   147      ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
   148    ) FROM t1
   149  }
   150  
   151  execsql_test 2.17 {
   152    SELECT a, sum(d) OVER (
   153      PARTITION BY b
   154      ORDER BY d 
   155      ROWS BETWEEN 1 PRECEDING AND 2 PRECEDING
   156    ) FROM t1
   157  }
   158  
   159  execsql_test 2.18 {
   160    SELECT a, sum(d) OVER (
   161      PARTITION BY b
   162      ORDER BY d 
   163      ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING
   164    ) FROM t1
   165  }
   166  
   167  execsql_test 2.19 {
   168    SELECT a, sum(d) OVER (
   169      PARTITION BY b
   170      ORDER BY d 
   171      ROWS BETWEEN 1 FOLLOWING AND 3 FOLLOWING
   172    ) FROM t1
   173  }
   174  
   175  execsql_test 2.20 {
   176    SELECT a, sum(d) OVER (
   177      ORDER BY d 
   178      ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
   179    ) FROM t1
   180  }
   181  
   182  execsql_test 2.21 {
   183    SELECT a, sum(d) OVER (
   184      ORDER BY d 
   185      ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
   186    ) FROM t1
   187  }
   188  
   189  execsql_test 2.22 {
   190    SELECT a, sum(d) OVER (
   191      PARTITION BY b
   192      ORDER BY d 
   193      ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
   194    ) FROM t1
   195  }
   196  
   197  execsql_test 2.23 {
   198    SELECT a, sum(d) OVER (
   199      ORDER BY d 
   200      ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   201    ) FROM t1
   202  }
   203  
   204  execsql_test 2.24 {
   205    SELECT a, sum(d) OVER (
   206      PARTITION BY a%2
   207      ORDER BY d 
   208      ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   209    ) FROM t1
   210  }
   211  
   212  execsql_test 2.25 {
   213    SELECT a, sum(d) OVER (
   214      ORDER BY d 
   215      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   216    ) FROM t1
   217  }
   218  
   219  execsql_test 2.26 {
   220    SELECT a, sum(d) OVER (
   221      PARTITION BY b
   222      ORDER BY d 
   223      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   224    ) FROM t1
   225  }
   226  
   227  execsql_test 2.27 {
   228    SELECT a, sum(d) OVER (
   229      ORDER BY d 
   230      ROWS BETWEEN CURRENT ROW AND CURRENT ROW
   231    ) FROM t1
   232  }
   233  
   234  execsql_test 2.28 {
   235    SELECT a, sum(d) OVER (
   236      PARTITION BY b
   237      ORDER BY d 
   238      ROWS BETWEEN CURRENT ROW AND CURRENT ROW
   239    ) FROM t1
   240  }
   241  
   242  execsql_test 2.29 {
   243    SELECT a, sum(d) OVER (
   244      ORDER BY d 
   245      RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   246    ) FROM t1
   247  }
   248  execsql_test 2.30 {
   249    SELECT a, sum(d) OVER (
   250      ORDER BY b 
   251      RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   252    ) FROM t1
   253  }
   254  
   255  execsql_test 3.1 {
   256    SELECT a, sum(d) OVER (
   257      PARTITION BY b ORDER BY d
   258      RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   259    ) FROM t1
   260  }
   261  
   262  execsql_test 3.2 {
   263    SELECT a, sum(d) OVER (
   264      ORDER BY b
   265      RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   266    ) FROM t1
   267  }
   268  
   269  execsql_test 3.3 {
   270    SELECT a, sum(d) OVER (
   271      ORDER BY d
   272      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   273    ) FROM t1
   274  }
   275  
   276  execsql_test 3.4 {
   277    SELECT a, sum(d) OVER (
   278      ORDER BY d/2
   279      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
   280    ) FROM t1
   281  }
   282  
   283  #puts $::fd finish_test
   284  
   285  ==========
   286  
   287  execsql_test 4.0 {
   288    DROP TABLE IF EXISTS t2;
   289    CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER);
   290    INSERT INTO t2(a, b) VALUES
   291    (1,0), (2,74), (3,41), (4,74), (5,23), (6,99), (7,26), (8,33), (9,2),
   292    (10,89), (11,81), (12,96), (13,59), (14,38), (15,68), (16,39), (17,62),
   293    (18,91), (19,46), (20,6), (21,99), (22,97), (23,27), (24,46), (25,78),
   294    (26,54), (27,97), (28,8), (29,67), (30,29), (31,93), (32,84), (33,77),
   295    (34,23), (35,16), (36,16), (37,93), (38,65), (39,35), (40,47), (41,7),
   296    (42,86), (43,74), (44,61), (45,91), (46,85), (47,24), (48,85), (49,43),
   297    (50,59), (51,12), (52,32), (53,56), (54,3), (55,91), (56,22), (57,90),
   298    (58,55), (59,15), (60,28), (61,89), (62,25), (63,47), (64,1), (65,56),
   299    (66,40), (67,43), (68,56), (69,16), (70,75), (71,36), (72,89), (73,98),
   300    (74,76), (75,81), (76,4), (77,94), (78,42), (79,30), (80,78), (81,33),
   301    (82,29), (83,53), (84,63), (85,2), (86,87), (87,37), (88,80), (89,84),
   302    (90,72), (91,41), (92,9), (93,61), (94,73), (95,95), (96,65), (97,13),
   303    (98,58), (99,96), (100,98), (101,1), (102,21), (103,74), (104,65), (105,35),
   304    (106,5), (107,73), (108,11), (109,51), (110,87), (111,41), (112,12), (113,8),
   305    (114,20), (115,31), (116,31), (117,15), (118,95), (119,22), (120,73), 
   306    (121,79), (122,88), (123,34), (124,8), (125,11), (126,49), (127,34), 
   307    (128,90), (129,59), (130,96), (131,60), (132,55), (133,75), (134,77),
   308    (135,44), (136,2), (137,7), (138,85), (139,57), (140,74), (141,29), (142,70),
   309    (143,59), (144,19), (145,39), (146,26), (147,26), (148,47), (149,80),
   310    (150,90), (151,36), (152,58), (153,47), (154,9), (155,72), (156,72), (157,66),
   311    (158,33), (159,93), (160,75), (161,64), (162,81), (163,9), (164,23), (165,37),
   312    (166,13), (167,12), (168,14), (169,62), (170,91), (171,36), (172,91),
   313    (173,33), (174,15), (175,34), (176,36), (177,99), (178,3), (179,95), (180,69),
   314    (181,58), (182,52), (183,30), (184,50), (185,84), (186,10), (187,84),
   315    (188,33), (189,21), (190,39), (191,44), (192,58), (193,30), (194,38),
   316    (195,34), (196,83), (197,27), (198,82), (199,17), (200,7);
   317  }
   318  
   319  execsql_test 4.1 {
   320    SELECT a, sum(b) OVER (
   321      PARTITION BY (b%10)
   322      ORDER BY b
   323    ) FROM t2 ORDER BY a;
   324  }
   325  
   326  execsql_test 4.2 {
   327    SELECT a, sum(b) OVER (
   328      PARTITION BY (b%10)
   329      ORDER BY b
   330      RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
   331    ) FROM t2 ORDER BY a;
   332  }
   333  
   334  execsql_test 4.3 {
   335    SELECT b, sum(b) OVER (
   336      ORDER BY b
   337      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
   338    ) FROM t2 ORDER BY b;
   339  }
   340  
   341  execsql_test 4.4 {
   342    SELECT b, sum(b) OVER (
   343      ORDER BY b
   344      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   345    ) FROM t2 ORDER BY b;
   346  }
   347  
   348  execsql_test 4.5 {
   349    SELECT b, sum(b) OVER (
   350      ORDER BY b
   351      RANGE BETWEEN CURRENT ROW AND CURRENT ROW
   352    ) FROM t2 ORDER BY b;
   353  }
   354  
   355  execsql_test 4.6.1 {
   356    SELECT b, sum(b) OVER (
   357      RANGE BETWEEN CURRENT ROW AND CURRENT ROW
   358    ) FROM t2 ORDER BY b;
   359  }
   360  execsql_test 4.6.2 {
   361    SELECT b, sum(b) OVER () FROM t2 ORDER BY b;
   362  }
   363  execsql_test 4.6.3 {
   364    SELECT b, sum(b) OVER (
   365      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   366    ) FROM t2 ORDER BY b;
   367  }
   368  execsql_test 4.6.4 {
   369    SELECT b, sum(b) OVER (
   370      RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   371    ) FROM t2 ORDER BY b;
   372  }
   373  
   374  execsql_test 4.7.1 {
   375    SELECT b, sum(b) OVER (
   376      ROWS BETWEEN CURRENT ROW AND CURRENT ROW
   377    ) FROM t2 ORDER BY 1, 2;
   378  }
   379  execsql_test 4.7.2 {
   380    SELECT b, sum(b) OVER (
   381      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
   382    ) FROM t2 ORDER BY 1, 2;
   383  }
   384  execsql_test 4.7.3 {
   385    SELECT b, sum(b) OVER (
   386      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   387    ) FROM t2 ORDER BY 1, 2;
   388  }
   389  execsql_test 4.7.4 {
   390    SELECT b, sum(b) OVER (
   391      ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   392    ) FROM t2 ORDER BY 1, 2;
   393  }
   394  
   395  execsql_test 4.8.1 {
   396    SELECT b, sum(b) OVER (
   397      ORDER BY a
   398      ROWS BETWEEN CURRENT ROW AND CURRENT ROW
   399    ) FROM t2 ORDER BY 1, 2;
   400  }
   401  execsql_test 4.8.2 {
   402    SELECT b, sum(b) OVER (
   403      ORDER BY a
   404      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
   405    ) FROM t2 ORDER BY 1, 2;
   406  }
   407  execsql_test 4.8.3 {
   408    SELECT b, sum(b) OVER (
   409      ORDER BY a
   410      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   411    ) FROM t2 ORDER BY 1, 2;
   412  }
   413  execsql_test 4.8.4 {
   414    SELECT b, sum(b) OVER (
   415      ORDER BY a
   416      ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   417    ) FROM t2 ORDER BY 1, 2;
   418  }
   419  
   420  execsql_float_test 4.9 {
   421    SELECT 
   422      rank() OVER win AS rank,
   423      cume_dist() OVER win AS cume_dist FROM t1
   424    WINDOW win AS (ORDER BY 1);
   425  }
   426  
   427  execsql_test 4.10 {
   428    SELECT count(*) OVER (ORDER BY b) FROM t1
   429  }
   430  
   431  execsql_test 4.11 {
   432    SELECT count(distinct a) FILTER (WHERE b='odd') FROM t1
   433  }
   434  
   435  ==========
   436  
   437  execsql_test 5.0 {
   438    DROP TABLE IF EXISTS t1;
   439    CREATE TABLE t1(x INTEGER, y INTEGER);
   440    INSERT INTO t1 VALUES(10, 1);
   441    INSERT INTO t1 VALUES(20, 2);
   442    INSERT INTO t1 VALUES(3, 3);
   443    INSERT INTO t1 VALUES(2, 4);
   444    INSERT INTO t1 VALUES(1, 5);
   445  }
   446  
   447  execsql_float_test 5.1 {
   448    SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z;
   449  }
   450  
   451  ==========
   452  
   453  execsql_test 6.0 {
   454    DROP TABLE IF EXISTS t0;
   455    CREATE TABLE t0(c0 INTEGER UNIQUE);
   456    INSERT INTO t0 VALUES(0);
   457  }
   458  execsql_test 6.1 {
   459    SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0;
   460  }
   461  execsql_test 6.2 {
   462    SELECT * FROM t0 WHERE 
   463        (0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0);
   464  } 
   465  
   466  ==========
   467  
   468  execsql_test 7.0 {
   469    DROP TABLE IF EXISTS t1;
   470    CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER);
   471    INSERT INTO t1 VALUES(1, 1, 1);
   472    INSERT INTO t1 VALUES(1, 2, 2);
   473    INSERT INTO t1 VALUES(3, 3, 3);
   474    INSERT INTO t1 VALUES(3, 4, 4);
   475  }
   476  
   477  execsql_test 7.1 {
   478    SELECT c, sum(c) OVER win1 FROM t1 
   479    WINDOW win1 AS (ORDER BY b)
   480  }
   481  
   482  execsql_test 7.2 {
   483    SELECT c, sum(c) OVER win1 FROM t1 
   484    WINDOW win1 AS (PARTITION BY 1 ORDER BY b)
   485  }
   486  
   487  execsql_test 7.3 {
   488    SELECT c, sum(c) OVER win1 FROM t1 
   489    WINDOW win1 AS (ORDER BY 1)
   490  }
   491  
   492  finish_test
   493  
   494