gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/window3.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 window3 "2018 May 31"
    18  ifcapable !windowfunc
    19  
    20  execsql_test 1.0 {
    21    DROP TABLE IF EXISTS t2;
    22    CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER);
    23    INSERT INTO t2(a, b) VALUES
    24    (10,89), (11,81), (12,96), (13,59), (14,38), (15,68), (16,39), (17,62),
    25    (18,91), (19,46), (20,6), (21,99), (22,97), (23,27), (24,46), (25,78),
    26    (26,54), (27,97), (28,8), (29,67), (30,29), (31,93), (32,84), (33,77),
    27    (34,23), (35,16), (36,16), (37,93), (38,65), (39,35), (40,47), (41,7),
    28    (42,86), (43,74), (44,61), (45,91), (46,85), (47,24), (48,85), (49,43),
    29    (50,59), (51,12), (52,32), (53,56), (54,3), (55,91), (56,22), (57,90),
    30    (58,55), (59,15), (60,28), (61,89), (62,25), (63,47), (64,1), (65,56),
    31    (66,40), (67,43), (68,56), (69,16), (70,75), (71,36), (72,89), (73,98),
    32    (74,76), (75,81), (76,4), (77,94), (78,42), (79,30), (80,78), (81,33),
    33    (82,29), (83,53), (84,63), (85,2), (86,87), (87,37), (88,80), (89,84),
    34    (90,72), (91,41), (92,9), (93,61), (94,73), (95,95), (96,65), (97,13),
    35    (98,58), (99,96), (100,98), (101,1), (102,21), (103,74), (104,65), (105,35),
    36    (106,5), (107,73), (108,11), (109,51), (110,87), (111,41), (112,12), (113,8),
    37    (114,20), (115,31), (116,31), (117,15), (118,95), (119,22), (120,73), 
    38    (121,79), (122,88), (123,34), (124,8), (125,11), (126,49), (127,34), 
    39    (128,90), (129,59), (130,96), (131,60), (132,55), (133,75), (134,77),
    40    (135,44), (136,2), (137,7), (138,85), (139,57), (140,74), (141,29), (142,70),
    41    (143,59), (144,19), (145,39), (146,26), (147,26), (148,47), (149,80),
    42    (150,90), (151,36), (152,58), (153,47), (154,9), (155,72), (156,72), (157,66),
    43    (158,33), (159,93), (160,75), (161,64), (162,81), (163,9), (164,23), (165,37),
    44    (166,13), (167,12), (168,14), (169,62), (170,91), (171,36), (172,91),
    45    (173,33), (174,15), (175,34), (176,36), (177,99), (178,3), (179,95), (180,69),
    46    (181,58), (182,52), (183,30), (184,50), (185,84), (186,10), (187,84),
    47    (188,33), (189,21), (190,39), (191,44), (192,58), (193,30), (194,38),
    48    (195,34), (196,83), (197,27), (198,82), (199,17), (200,7);
    49  }
    50  
    51  execsql_test 1.1 {
    52    SELECT max(b) OVER (
    53      ORDER BY a
    54    ) FROM t2
    55  }
    56  
    57  foreach {tn window} {
    58     1 "RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW"
    59     2 "RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING"
    60     3 "RANGE BETWEEN CURRENT ROW         AND CURRENT ROW"
    61     4 "RANGE BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING"
    62     5 "ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING"
    63     6 "ROWS BETWEEN 4 PRECEDING    AND 2 PRECEDING"
    64     7 "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW"
    65     8 "ROWS BETWEEN 4 PRECEDING    AND CURRENT ROW"
    66     9 "ROWS BETWEEN CURRENT ROW         AND CURRENT ROW"
    67    10 "ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING"
    68    11 "ROWS BETWEEN 4 PRECEDING    AND 2 FOLLOWING"
    69    12 "ROWS BETWEEN CURRENT ROW         AND 4 FOLLOWING"
    70    13 "ROWS BETWEEN 2 FOLLOWING    AND 4 FOLLOWING"
    71    14 "ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING"
    72    15 "ROWS BETWEEN 4 PRECEDING    AND UNBOUNDED FOLLOWING"
    73    16 "ROWS BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING"
    74    17 "ROWS BETWEEN 4 FOLLOWING    AND UNBOUNDED FOLLOWING"
    75  
    76    18 "ROWS BETWEEN 4 PRECEDING    AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW"
    77    19 "ROWS BETWEEN 4 PRECEDING    AND UNBOUNDED FOLLOWING EXCLUDE TIES"
    78    20 "ROWS BETWEEN 4 PRECEDING    AND UNBOUNDED FOLLOWING EXCLUDE GROUP"
    79  
    80  } {
    81    execsql_test 1.$tn.2.1 "SELECT max(b) OVER ( ORDER BY a $window ) FROM t2"
    82    execsql_test 1.$tn.2.2 "SELECT min(b) OVER ( ORDER BY a $window ) FROM t2"
    83  
    84    execsql_test 1.$tn.3.1 "
    85      SELECT row_number() OVER ( ORDER BY a $window ) FROM t2
    86    "
    87    execsql_test 1.$tn.3.2 "
    88      SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a $window ) FROM t2
    89    "
    90    execsql_test 1.$tn.3.3 "
    91      SELECT row_number() OVER ( $window ) FROM t2
    92    "
    93  
    94    execsql_test 1.$tn.4.1 "
    95      SELECT dense_rank() OVER ( ORDER BY a $window ) FROM t2
    96    "
    97    execsql_test 1.$tn.4.2 "
    98      SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a $window ) FROM t2
    99    "
   100    execsql_test 1.$tn.4.3 "
   101      SELECT dense_rank() OVER ( ORDER BY b $window ) FROM t2
   102    "
   103    execsql_test 1.$tn.4.4 "
   104      SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b $window ) FROM t2
   105    "
   106    execsql_test 1.$tn.4.5 "
   107      SELECT dense_rank() OVER ( ORDER BY b%10 $window ) FROM t2
   108    "
   109    execsql_test 1.$tn.4.6 "
   110      SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 $window ) FROM t2
   111    "
   112  
   113    execsql_test 1.$tn.5.1 "
   114      SELECT rank() OVER ( ORDER BY a $window ) FROM t2
   115    "
   116    execsql_test 1.$tn.5.2 "
   117      SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a $window ) FROM t2
   118    "
   119    execsql_test 1.$tn.5.3 "
   120      SELECT rank() OVER ( ORDER BY b $window ) FROM t2
   121    "
   122    execsql_test 1.$tn.5.4 "
   123      SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b $window ) FROM t2
   124    "
   125    execsql_test 1.$tn.5.5 "
   126      SELECT rank() OVER ( ORDER BY b%10 $window ) FROM t2
   127    "
   128    execsql_test 1.$tn.5.6 "
   129      SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 $window ) FROM t2
   130    "
   131  
   132    execsql_test 1.$tn.6.1 "
   133      SELECT 
   134        row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 $window ),
   135        rank() OVER ( PARTITION BY b%2 ORDER BY b%10 $window ),
   136        dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 $window )
   137      FROM t2
   138    "
   139  
   140    execsql_float_test 1.$tn.7.1 "
   141      SELECT percent_rank() OVER ( ORDER BY a $window ) FROM t2
   142    "
   143    execsql_float_test 1.$tn.7.2 "
   144      SELECT percent_rank() OVER ( PARTITION BY b%10 ORDER BY a $window ) FROM t2
   145    "
   146    execsql_float_test 1.$tn.7.3 "
   147      SELECT percent_rank() OVER ( ORDER BY b $window ) FROM t2
   148    "
   149    execsql_float_test 1.$tn.7.4 "
   150      SELECT percent_rank() OVER ( PARTITION BY b%10 ORDER BY b $window ) FROM t2
   151    "
   152    execsql_float_test 1.$tn.7.5 "
   153      SELECT percent_rank() OVER ( ORDER BY b%10 $window ) FROM t2
   154    "
   155    execsql_float_test 1.$tn.7.6 "
   156      SELECT percent_rank() OVER (PARTITION BY b%2 ORDER BY b%10 $window) FROM t2
   157    "
   158  
   159    execsql_float_test 1.$tn.8.1 "
   160      SELECT cume_dist() OVER ( ORDER BY a $window ) FROM t2
   161    "
   162    execsql_float_test 1.$tn.8.2 "
   163      SELECT cume_dist() OVER ( PARTITION BY b%10 ORDER BY a $window ) FROM t2
   164    "
   165    execsql_float_test 1.$tn.8.3 "
   166      SELECT cume_dist() OVER ( ORDER BY b $window ) FROM t2
   167    "
   168    execsql_float_test 1.$tn.8.4 "
   169      SELECT cume_dist() OVER ( PARTITION BY b%10 ORDER BY b $window ) FROM t2
   170    "
   171    execsql_float_test 1.$tn.8.5 "
   172      SELECT cume_dist() OVER ( ORDER BY b%10 $window ) FROM t2
   173    "
   174    execsql_float_test 1.$tn.8.6 "
   175      SELECT cume_dist() OVER ( PARTITION BY b%2 ORDER BY b%10 $window ) FROM t2
   176    "
   177  
   178    execsql_float_test 1.$tn.8.1 "
   179      SELECT ntile(100) OVER ( ORDER BY a $window ) FROM t2
   180    "
   181    execsql_float_test 1.$tn.8.2 "
   182      SELECT ntile(101) OVER ( PARTITION BY b%10 ORDER BY a $window ) FROM t2
   183    "
   184    execsql_float_test 1.$tn.8.3 "
   185      SELECT ntile(102) OVER ( ORDER BY b,a $window ) FROM t2
   186    "
   187    execsql_float_test 1.$tn.8.4 "
   188      SELECT ntile(103) OVER ( PARTITION BY b%10 ORDER BY b,a $window ) FROM t2
   189    "
   190    execsql_float_test 1.$tn.8.5 "
   191      SELECT ntile(104) OVER ( ORDER BY b%10,a $window ) FROM t2
   192    "
   193    execsql_float_test 1.$tn.8.6 "
   194      SELECT ntile(105) OVER (PARTITION BY b%2,a ORDER BY b%10 $window) FROM t2
   195    "
   196    execsql_float_test 1.$tn.8.7 "
   197      SELECT ntile(105) OVER ( $window ) FROM t2
   198    "
   199  
   200    execsql_test 1.$tn.9.1 "
   201      SELECT last_value(a+b) OVER ( ORDER BY a $window ) FROM t2
   202    "
   203    execsql_test 1.$tn.9.2 "
   204      SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a $window ) FROM t2
   205    "
   206    execsql_test 1.$tn.9.3 "
   207      SELECT last_value(a+b) OVER ( ORDER BY b,a $window ) FROM t2
   208    "
   209    execsql_test 1.$tn.9.4 "
   210      SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a $window ) FROM t2
   211    "
   212    execsql_test 1.$tn.9.5 "
   213      SELECT last_value(a+b) OVER ( ORDER BY b%10,a $window ) FROM t2
   214    "
   215    execsql_test 1.$tn.9.6 "
   216      SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 $window) FROM t2
   217    "
   218  
   219    execsql_test 1.$tn.10.1 "
   220      SELECT nth_value(b,b+1) OVER (ORDER BY a $window) FROM t2
   221    "
   222    execsql_test 1.$tn.10.2 "
   223      SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a $window) FROM t2
   224    "
   225    execsql_test 1.$tn.10.3 "
   226      SELECT nth_value(b,b+1) OVER ( ORDER BY b,a $window ) FROM t2
   227    "
   228    execsql_test 1.$tn.10.4 "
   229      SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a $window ) FROM t2
   230    "
   231    execsql_test 1.$tn.10.5 "
   232      SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a $window ) FROM t2
   233    "
   234    execsql_test 1.$tn.10.6 "
   235      SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 $window) FROM t2
   236    "
   237  
   238    execsql_test 1.$tn.11.1 "
   239      SELECT first_value(b) OVER (ORDER BY a $window) FROM t2
   240    "
   241    execsql_test 1.$tn.11.2 "
   242      SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a $window) FROM t2
   243    "
   244    execsql_test 1.$tn.11.3 "
   245      SELECT first_value(b) OVER ( ORDER BY b,a $window ) FROM t2
   246    "
   247    execsql_test 1.$tn.11.4 "
   248      SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a $window ) FROM t2
   249    "
   250    execsql_test 1.$tn.11.5 "
   251      SELECT first_value(b) OVER ( ORDER BY b%10,a $window ) FROM t2
   252    "
   253    execsql_test 1.$tn.11.6 "
   254      SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 $window) FROM t2
   255    "
   256  
   257    execsql_test 1.$tn.12.1 "
   258      SELECT lead(b,b) OVER (ORDER BY a $window) FROM t2
   259    "
   260    execsql_test 1.$tn.12.2 "
   261      SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a $window) FROM t2
   262    "
   263    execsql_test 1.$tn.12.3 "
   264      SELECT lead(b,b) OVER ( ORDER BY b,a $window ) FROM t2
   265    "
   266    execsql_test 1.$tn.12.4 "
   267      SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a $window ) FROM t2
   268    "
   269    execsql_test 1.$tn.12.5 "
   270      SELECT lead(b,b) OVER ( ORDER BY b%10,a $window ) FROM t2
   271    "
   272    execsql_test 1.$tn.12.6 "
   273      SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 $window) FROM t2
   274    "
   275  
   276    execsql_test 1.$tn.13.1 "
   277      SELECT lag(b,b) OVER (ORDER BY a $window) FROM t2
   278    "
   279    execsql_test 1.$tn.13.2 "
   280      SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a $window) FROM t2
   281    "
   282    execsql_test 1.$tn.13.3 "
   283      SELECT lag(b,b) OVER ( ORDER BY b,a $window ) FROM t2
   284    "
   285    execsql_test 1.$tn.13.4 "
   286      SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a $window ) FROM t2
   287    "
   288    execsql_test 1.$tn.13.5 "
   289      SELECT lag(b,b) OVER ( ORDER BY b%10,a $window ) FROM t2
   290    "
   291    execsql_test 1.$tn.13.6 "
   292      SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 $window) FROM t2
   293    "
   294  
   295    execsql_test 1.$tn.14.1 "
   296      SELECT string_agg(CAST(b AS TEXT), '.') OVER (ORDER BY a $window) FROM t2
   297    "
   298    execsql_test 1.$tn.14.2 "
   299      SELECT string_agg(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a $window) FROM t2
   300    "
   301    execsql_test 1.$tn.14.3 "
   302      SELECT string_agg(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a $window ) FROM t2
   303    "
   304    execsql_test 1.$tn.14.4 "
   305      SELECT string_agg(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a $window ) FROM t2
   306    "
   307    execsql_test 1.$tn.14.5 "
   308      SELECT string_agg(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a $window ) FROM t2
   309    "
   310    execsql_test 1.$tn.14.6 "
   311      SELECT string_agg(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 $window) FROM t2
   312    "
   313  
   314    execsql_test 1.$tn.14.7 "
   315      SELECT string_agg(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 $window) 
   316      FROM t2
   317      WINDOW win1 AS (PARTITION BY b%2,a)
   318      ORDER BY 1
   319    "
   320  
   321    execsql_test 1.$tn.14.8 "
   322      SELECT string_agg(CAST(b AS TEXT), '.') OVER (win1 $window) 
   323      FROM t2
   324      WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10)
   325      ORDER BY 1
   326    "
   327  
   328    execsql_test 1.$tn.14.9 "
   329      SELECT string_agg(CAST(b AS TEXT), '.') OVER win2
   330      FROM t2
   331      WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10),
   332             win2 AS (win1 $window)
   333      ORDER BY 1
   334    "
   335  
   336    execsql_test 1.$tn.15.1 "
   337      SELECT count(*) OVER win, string_agg(CAST(b AS TEXT), '.') 
   338      FILTER (WHERE a%2=0) OVER win FROM t2
   339      WINDOW win AS (ORDER BY a $window)
   340    "
   341  
   342    execsql_test 1.$tn.15.2 "
   343      SELECT count(*) OVER win, string_agg(CAST(b AS TEXT), '.') 
   344      FILTER (WHERE 0=1) OVER win FROM t2
   345      WINDOW win AS (ORDER BY a $window)
   346    "
   347  
   348    execsql_test 1.$tn.15.3 "
   349      SELECT count(*) OVER win, string_agg(CAST(b AS TEXT), '.') 
   350      FILTER (WHERE 1=0) OVER win FROM t2
   351      WINDOW win AS (PARTITION BY (a%10) ORDER BY a $window)
   352    "
   353  
   354    execsql_test 1.$tn.15.4 "
   355      SELECT count(*) OVER win, string_agg(CAST(b AS TEXT), '.') 
   356      FILTER (WHERE a%2=0) OVER win FROM t2
   357      WINDOW win AS (PARTITION BY (a%10) ORDER BY a $window)
   358    "
   359  
   360  }
   361  
   362  finish_test
   363