]> granicus.if.org Git - postgresql/blob - src/test/regress/expected/window.out
Improve EXPLAIN to print the grouping columns in Agg and Group nodes.
[postgresql] / src / test / regress / expected / window.out
1 --
2 -- WINDOW FUNCTIONS
3 --
4 CREATE TEMPORARY TABLE empsalary (
5     depname varchar,
6     empno bigint,
7     salary int,
8     enroll_date date
9 );
10 INSERT INTO empsalary VALUES
11 ('develop', 10, 5200, '2007-08-01'),
12 ('sales', 1, 5000, '2006-10-01'),
13 ('personnel', 5, 3500, '2007-12-10'),
14 ('sales', 4, 4800, '2007-08-08'),
15 ('personnel', 2, 3900, '2006-12-23'),
16 ('develop', 7, 4200, '2008-01-01'),
17 ('develop', 9, 4500, '2008-01-01'),
18 ('sales', 3, 4800, '2007-08-01'),
19 ('develop', 8, 6000, '2006-10-01'),
20 ('develop', 11, 5200, '2007-08-15');
21 SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary ORDER BY depname, salary;
22   depname  | empno | salary |  sum  
23 -----------+-------+--------+-------
24  develop   |     7 |   4200 | 25100
25  develop   |     9 |   4500 | 25100
26  develop   |    11 |   5200 | 25100
27  develop   |    10 |   5200 | 25100
28  develop   |     8 |   6000 | 25100
29  personnel |     5 |   3500 |  7400
30  personnel |     2 |   3900 |  7400
31  sales     |     3 |   4800 | 14600
32  sales     |     4 |   4800 | 14600
33  sales     |     1 |   5000 | 14600
34 (10 rows)
35
36 SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary) FROM empsalary;
37   depname  | empno | salary | rank 
38 -----------+-------+--------+------
39  develop   |     7 |   4200 |    1
40  develop   |     9 |   4500 |    2
41  develop   |    11 |   5200 |    3
42  develop   |    10 |   5200 |    3
43  develop   |     8 |   6000 |    5
44  personnel |     5 |   3500 |    1
45  personnel |     2 |   3900 |    2
46  sales     |     3 |   4800 |    1
47  sales     |     4 |   4800 |    1
48  sales     |     1 |   5000 |    3
49 (10 rows)
50
51 -- with GROUP BY
52 SELECT four, ten, SUM(SUM(four)) OVER (PARTITION BY four), AVG(ten) FROM tenk1
53 GROUP BY four, ten ORDER BY four, ten;
54  four | ten | sum  |          avg           
55 ------+-----+------+------------------------
56     0 |   0 |    0 | 0.00000000000000000000
57     0 |   2 |    0 |     2.0000000000000000
58     0 |   4 |    0 |     4.0000000000000000
59     0 |   6 |    0 |     6.0000000000000000
60     0 |   8 |    0 |     8.0000000000000000
61     1 |   1 | 2500 | 1.00000000000000000000
62     1 |   3 | 2500 |     3.0000000000000000
63     1 |   5 | 2500 |     5.0000000000000000
64     1 |   7 | 2500 |     7.0000000000000000
65     1 |   9 | 2500 |     9.0000000000000000
66     2 |   0 | 5000 | 0.00000000000000000000
67     2 |   2 | 5000 |     2.0000000000000000
68     2 |   4 | 5000 |     4.0000000000000000
69     2 |   6 | 5000 |     6.0000000000000000
70     2 |   8 | 5000 |     8.0000000000000000
71     3 |   1 | 7500 | 1.00000000000000000000
72     3 |   3 | 7500 |     3.0000000000000000
73     3 |   5 | 7500 |     5.0000000000000000
74     3 |   7 | 7500 |     7.0000000000000000
75     3 |   9 | 7500 |     9.0000000000000000
76 (20 rows)
77
78 SELECT depname, empno, salary, sum(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname);
79   depname  | empno | salary |  sum  
80 -----------+-------+--------+-------
81  develop   |    11 |   5200 | 25100
82  develop   |     7 |   4200 | 25100
83  develop   |     9 |   4500 | 25100
84  develop   |     8 |   6000 | 25100
85  develop   |    10 |   5200 | 25100
86  personnel |     5 |   3500 |  7400
87  personnel |     2 |   3900 |  7400
88  sales     |     3 |   4800 | 14600
89  sales     |     1 |   5000 | 14600
90  sales     |     4 |   4800 | 14600
91 (10 rows)
92
93 SELECT depname, empno, salary, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary) ORDER BY rank() OVER w;
94   depname  | empno | salary | rank 
95 -----------+-------+--------+------
96  develop   |     7 |   4200 |    1
97  personnel |     5 |   3500 |    1
98  sales     |     3 |   4800 |    1
99  sales     |     4 |   4800 |    1
100  personnel |     2 |   3900 |    2
101  develop   |     9 |   4500 |    2
102  sales     |     1 |   5000 |    3
103  develop   |    11 |   5200 |    3
104  develop   |    10 |   5200 |    3
105  develop   |     8 |   6000 |    5
106 (10 rows)
107
108 -- empty window specification
109 SELECT COUNT(*) OVER () FROM tenk1 WHERE unique2 < 10;
110  count 
111 -------
112     10
113     10
114     10
115     10
116     10
117     10
118     10
119     10
120     10
121     10
122 (10 rows)
123
124 SELECT COUNT(*) OVER w FROM tenk1 WHERE unique2 < 10 WINDOW w AS ();
125  count 
126 -------
127     10
128     10
129     10
130     10
131     10
132     10
133     10
134     10
135     10
136     10
137 (10 rows)
138
139 -- no window operation
140 SELECT four FROM tenk1 WHERE FALSE WINDOW w AS (PARTITION BY ten);
141  four 
142 ------
143 (0 rows)
144
145 -- cumulative aggregate
146 SELECT sum(four) OVER (PARTITION BY ten ORDER BY unique2) AS sum_1, ten, four FROM tenk1 WHERE unique2 < 10;
147  sum_1 | ten | four 
148 -------+-----+------
149      0 |   0 |    0
150      0 |   0 |    0
151      2 |   0 |    2
152      3 |   1 |    3
153      4 |   1 |    1
154      5 |   1 |    1
155      3 |   3 |    3
156      0 |   4 |    0
157      1 |   7 |    1
158      1 |   9 |    1
159 (10 rows)
160
161 SELECT row_number() OVER (ORDER BY unique2) FROM tenk1 WHERE unique2 < 10;
162  row_number 
163 ------------
164           1
165           2
166           3
167           4
168           5
169           6
170           7
171           8
172           9
173          10
174 (10 rows)
175
176 SELECT rank() OVER (PARTITION BY four ORDER BY ten) AS rank_1, ten, four FROM tenk1 WHERE unique2 < 10;
177  rank_1 | ten | four 
178 --------+-----+------
179       1 |   0 |    0
180       1 |   0 |    0
181       3 |   4 |    0
182       1 |   1 |    1
183       1 |   1 |    1
184       3 |   7 |    1
185       4 |   9 |    1
186       1 |   0 |    2
187       1 |   1 |    3
188       2 |   3 |    3
189 (10 rows)
190
191 SELECT dense_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
192  dense_rank | ten | four 
193 ------------+-----+------
194           1 |   0 |    0
195           1 |   0 |    0
196           2 |   4 |    0
197           1 |   1 |    1
198           1 |   1 |    1
199           2 |   7 |    1
200           3 |   9 |    1
201           1 |   0 |    2
202           1 |   1 |    3
203           2 |   3 |    3
204 (10 rows)
205
206 SELECT percent_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
207    percent_rank    | ten | four 
208 -------------------+-----+------
209                  0 |   0 |    0
210                  0 |   0 |    0
211                  1 |   4 |    0
212                  0 |   1 |    1
213                  0 |   1 |    1
214  0.666666666666667 |   7 |    1
215                  1 |   9 |    1
216                  0 |   0 |    2
217                  0 |   1 |    3
218                  1 |   3 |    3
219 (10 rows)
220
221 SELECT cume_dist() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
222      cume_dist     | ten | four 
223 -------------------+-----+------
224  0.666666666666667 |   0 |    0
225  0.666666666666667 |   0 |    0
226                  1 |   4 |    0
227                0.5 |   1 |    1
228                0.5 |   1 |    1
229               0.75 |   7 |    1
230                  1 |   9 |    1
231                  1 |   0 |    2
232                0.5 |   1 |    3
233                  1 |   3 |    3
234 (10 rows)
235
236 SELECT ntile(3) OVER (ORDER BY ten, four), ten, four FROM tenk1 WHERE unique2 < 10;
237  ntile | ten | four 
238 -------+-----+------
239      1 |   0 |    0
240      1 |   0 |    0
241      1 |   0 |    2
242      1 |   1 |    1
243      2 |   1 |    1
244      2 |   1 |    3
245      2 |   3 |    3
246      3 |   4 |    0
247      3 |   7 |    1
248      3 |   9 |    1
249 (10 rows)
250
251 SELECT ntile(NULL) OVER (ORDER BY ten, four), ten, four FROM tenk1 LIMIT 2;
252  ntile | ten | four 
253 -------+-----+------
254        |   0 |    0
255        |   0 |    0
256 (2 rows)
257
258 SELECT lag(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
259  lag | ten | four 
260 -----+-----+------
261      |   0 |    0
262    0 |   0 |    0
263    0 |   4 |    0
264      |   1 |    1
265    1 |   1 |    1
266    1 |   7 |    1
267    7 |   9 |    1
268      |   0 |    2
269      |   1 |    3
270    1 |   3 |    3
271 (10 rows)
272
273 SELECT lag(ten, four) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
274  lag | ten | four 
275 -----+-----+------
276    0 |   0 |    0
277    0 |   0 |    0
278    4 |   4 |    0
279      |   1 |    1
280    1 |   1 |    1
281    1 |   7 |    1
282    7 |   9 |    1
283      |   0 |    2
284      |   1 |    3
285      |   3 |    3
286 (10 rows)
287
288 SELECT lag(ten, four, 0) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
289  lag | ten | four 
290 -----+-----+------
291    0 |   0 |    0
292    0 |   0 |    0
293    4 |   4 |    0
294    0 |   1 |    1
295    1 |   1 |    1
296    1 |   7 |    1
297    7 |   9 |    1
298    0 |   0 |    2
299    0 |   1 |    3
300    0 |   3 |    3
301 (10 rows)
302
303 SELECT lead(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
304  lead | ten | four 
305 ------+-----+------
306     0 |   0 |    0
307     4 |   0 |    0
308       |   4 |    0
309     1 |   1 |    1
310     7 |   1 |    1
311     9 |   7 |    1
312       |   9 |    1
313       |   0 |    2
314     3 |   1 |    3
315       |   3 |    3
316 (10 rows)
317
318 SELECT lead(ten * 2, 1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
319  lead | ten | four 
320 ------+-----+------
321     0 |   0 |    0
322     8 |   0 |    0
323       |   4 |    0
324     2 |   1 |    1
325    14 |   1 |    1
326    18 |   7 |    1
327       |   9 |    1
328       |   0 |    2
329     6 |   1 |    3
330       |   3 |    3
331 (10 rows)
332
333 SELECT lead(ten * 2, 1, -1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
334  lead | ten | four 
335 ------+-----+------
336     0 |   0 |    0
337     8 |   0 |    0
338    -1 |   4 |    0
339     2 |   1 |    1
340    14 |   1 |    1
341    18 |   7 |    1
342    -1 |   9 |    1
343    -1 |   0 |    2
344     6 |   1 |    3
345    -1 |   3 |    3
346 (10 rows)
347
348 SELECT first_value(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
349  first_value | ten | four 
350 -------------+-----+------
351            0 |   0 |    0
352            0 |   0 |    0
353            0 |   4 |    0
354            1 |   1 |    1
355            1 |   1 |    1
356            1 |   7 |    1
357            1 |   9 |    1
358            0 |   0 |    2
359            1 |   1 |    3
360            1 |   3 |    3
361 (10 rows)
362
363 -- last_value returns the last row of the frame, which is CURRENT ROW in ORDER BY window.
364 SELECT last_value(four) OVER (ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
365  last_value | ten | four 
366 ------------+-----+------
367           0 |   0 |    0
368           0 |   0 |    2
369           0 |   0 |    0
370           1 |   1 |    1
371           1 |   1 |    3
372           1 |   1 |    1
373           3 |   3 |    3
374           0 |   4 |    0
375           1 |   7 |    1
376           1 |   9 |    1
377 (10 rows)
378
379 SELECT last_value(ten) OVER (PARTITION BY four), ten, four FROM
380         (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s
381         ORDER BY four, ten;
382  last_value | ten | four 
383 ------------+-----+------
384           4 |   0 |    0
385           4 |   0 |    0
386           4 |   4 |    0
387           9 |   1 |    1
388           9 |   1 |    1
389           9 |   7 |    1
390           9 |   9 |    1
391           0 |   0 |    2
392           3 |   1 |    3
393           3 |   3 |    3
394 (10 rows)
395
396 SELECT nth_value(ten, four + 1) OVER (PARTITION BY four), ten, four
397         FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s;
398  nth_value | ten | four 
399 -----------+-----+------
400          0 |   0 |    0
401          0 |   0 |    0
402          0 |   4 |    0
403          1 |   1 |    1
404          1 |   1 |    1
405          1 |   7 |    1
406          1 |   9 |    1
407            |   0 |    2
408            |   1 |    3
409            |   3 |    3
410 (10 rows)
411
412 SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER (PARTITION BY two ORDER BY ten) AS wsum
413 FROM tenk1 GROUP BY ten, two;
414  ten | two | gsum  |  wsum  
415 -----+-----+-------+--------
416    0 |   0 | 45000 |  45000
417    2 |   0 | 47000 |  92000
418    4 |   0 | 49000 | 141000
419    6 |   0 | 51000 | 192000
420    8 |   0 | 53000 | 245000
421    1 |   1 | 46000 |  46000
422    3 |   1 | 48000 |  94000
423    5 |   1 | 50000 | 144000
424    7 |   1 | 52000 | 196000
425    9 |   1 | 54000 | 250000
426 (10 rows)
427
428 SELECT count(*) OVER (PARTITION BY four), four FROM (SELECT * FROM tenk1 WHERE two = 1)s WHERE unique2 < 10;
429  count | four 
430 -------+------
431      4 |    1
432      4 |    1
433      4 |    1
434      4 |    1
435      2 |    3
436      2 |    3
437 (6 rows)
438
439 SELECT (count(*) OVER (PARTITION BY four ORDER BY ten) +
440   sum(hundred) OVER (PARTITION BY four ORDER BY ten))::varchar AS cntsum
441   FROM tenk1 WHERE unique2 < 10;
442  cntsum 
443 --------
444  22
445  22
446  87
447  24
448  24
449  82
450  92
451  51
452  92
453  136
454 (10 rows)
455
456 -- opexpr with different windows evaluation.
457 SELECT * FROM(
458   SELECT count(*) OVER (PARTITION BY four ORDER BY ten) +
459     sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS total,
460     count(*) OVER (PARTITION BY four ORDER BY ten) AS fourcount,
461     sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS twosum
462     FROM tenk1
463 )sub
464 WHERE total <> fourcount + twosum;
465  total | fourcount | twosum 
466 -------+-----------+--------
467 (0 rows)
468
469 SELECT avg(four) OVER (PARTITION BY four ORDER BY thousand / 100) FROM tenk1 WHERE unique2 < 10;
470           avg           
471 ------------------------
472  0.00000000000000000000
473  0.00000000000000000000
474  0.00000000000000000000
475  1.00000000000000000000
476  1.00000000000000000000
477  1.00000000000000000000
478  1.00000000000000000000
479      2.0000000000000000
480      3.0000000000000000
481      3.0000000000000000
482 (10 rows)
483
484 SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER win AS wsum
485 FROM tenk1 GROUP BY ten, two WINDOW win AS (PARTITION BY two ORDER BY ten);
486  ten | two | gsum  |  wsum  
487 -----+-----+-------+--------
488    0 |   0 | 45000 |  45000
489    2 |   0 | 47000 |  92000
490    4 |   0 | 49000 | 141000
491    6 |   0 | 51000 | 192000
492    8 |   0 | 53000 | 245000
493    1 |   1 | 46000 |  46000
494    3 |   1 | 48000 |  94000
495    5 |   1 | 50000 | 144000
496    7 |   1 | 52000 | 196000
497    9 |   1 | 54000 | 250000
498 (10 rows)
499
500 -- more than one window with GROUP BY
501 SELECT sum(salary),
502         row_number() OVER (ORDER BY depname),
503         sum(sum(salary)) OVER (ORDER BY depname DESC)
504 FROM empsalary GROUP BY depname;
505   sum  | row_number |  sum  
506 -------+------------+-------
507  14600 |          3 | 14600
508   7400 |          2 | 22000
509  25100 |          1 | 47100
510 (3 rows)
511
512 -- identical windows with different names
513 SELECT sum(salary) OVER w1, count(*) OVER w2
514 FROM empsalary WINDOW w1 AS (ORDER BY salary), w2 AS (ORDER BY salary);
515   sum  | count 
516 -------+-------
517   3500 |     1
518   7400 |     2
519  11600 |     3
520  16100 |     4
521  25700 |     6
522  25700 |     6
523  30700 |     7
524  41100 |     9
525  41100 |     9
526  47100 |    10
527 (10 rows)
528
529 -- subplan
530 SELECT lead(ten, (SELECT two FROM tenk1 WHERE s.unique2 = unique2)) OVER (PARTITION BY four ORDER BY ten)
531 FROM tenk1 s WHERE unique2 < 10;
532  lead 
533 ------
534     0
535     0
536     4
537     1
538     7
539     9
540      
541     0
542     3
543      
544 (10 rows)
545
546 -- empty table
547 SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 WHERE FALSE)s;
548  count 
549 -------
550 (0 rows)
551
552 -- mixture of agg/wfunc in the same window
553 SELECT sum(salary) OVER w, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
554   sum  | rank 
555 -------+------
556   6000 |    1
557  16400 |    2
558  16400 |    2
559  20900 |    4
560  25100 |    5
561   3900 |    1
562   7400 |    2
563   5000 |    1
564  14600 |    2
565  14600 |    2
566 (10 rows)
567
568 -- strict aggs
569 SELECT empno, depname, salary, bonus, depadj, MIN(bonus) OVER (ORDER BY empno), MAX(depadj) OVER () FROM(
570         SELECT *,
571                 CASE WHEN enroll_date < '2008-01-01' THEN 2008 - extract(YEAR FROM enroll_date) END * 500 AS bonus,
572                 CASE WHEN
573                         AVG(salary) OVER (PARTITION BY depname) < salary
574                 THEN 200 END AS depadj FROM empsalary
575 )s;
576  empno |  depname  | salary | bonus | depadj | min  | max 
577 -------+-----------+--------+-------+--------+------+-----
578      1 | sales     |   5000 |  1000 |    200 | 1000 | 200
579      2 | personnel |   3900 |  1000 |    200 | 1000 | 200
580      3 | sales     |   4800 |   500 |        |  500 | 200
581      4 | sales     |   4800 |   500 |        |  500 | 200
582      5 | personnel |   3500 |   500 |        |  500 | 200
583      7 | develop   |   4200 |       |        |  500 | 200
584      8 | develop   |   6000 |  1000 |    200 |  500 | 200
585      9 | develop   |   4500 |       |        |  500 | 200
586     10 | develop   |   5200 |   500 |    200 |  500 | 200
587     11 | develop   |   5200 |   500 |    200 |  500 | 200
588 (10 rows)
589
590 -- window function over ungrouped agg over empty row set (bug before 9.1)
591 SELECT SUM(COUNT(f1)) OVER () FROM int4_tbl WHERE f1=42;
592  sum 
593 -----
594    0
595 (1 row)
596
597 -- window function with ORDER BY an expression involving aggregates (9.1 bug)
598 select ten,
599   sum(unique1) + sum(unique2) as res,
600   rank() over (order by sum(unique1) + sum(unique2)) as rank
601 from tenk1
602 group by ten order by ten;
603  ten |   res    | rank 
604 -----+----------+------
605    0 |  9976146 |    4
606    1 | 10114187 |    9
607    2 | 10059554 |    8
608    3 |  9878541 |    1
609    4 |  9881005 |    2
610    5 |  9981670 |    5
611    6 |  9947099 |    3
612    7 | 10120309 |   10
613    8 |  9991305 |    6
614    9 | 10040184 |    7
615 (10 rows)
616
617 -- window and aggregate with GROUP BY expression (9.2 bug)
618 explain (costs off)
619 select first_value(max(x)) over (), y
620   from (select unique1 as x, ten+four as y from tenk1) ss
621   group by y;
622                  QUERY PLAN                  
623 ---------------------------------------------
624  WindowAgg
625    ->  HashAggregate
626          Group Key: (tenk1.ten + tenk1.four)
627          ->  Seq Scan on tenk1
628 (4 rows)
629
630 -- test non-default frame specifications
631 SELECT four, ten,
632         sum(ten) over (partition by four order by ten),
633         last_value(ten) over (partition by four order by ten)
634 FROM (select distinct ten, four from tenk1) ss;
635  four | ten | sum | last_value 
636 ------+-----+-----+------------
637     0 |   0 |   0 |          0
638     0 |   2 |   2 |          2
639     0 |   4 |   6 |          4
640     0 |   6 |  12 |          6
641     0 |   8 |  20 |          8
642     1 |   1 |   1 |          1
643     1 |   3 |   4 |          3
644     1 |   5 |   9 |          5
645     1 |   7 |  16 |          7
646     1 |   9 |  25 |          9
647     2 |   0 |   0 |          0
648     2 |   2 |   2 |          2
649     2 |   4 |   6 |          4
650     2 |   6 |  12 |          6
651     2 |   8 |  20 |          8
652     3 |   1 |   1 |          1
653     3 |   3 |   4 |          3
654     3 |   5 |   9 |          5
655     3 |   7 |  16 |          7
656     3 |   9 |  25 |          9
657 (20 rows)
658
659 SELECT four, ten,
660         sum(ten) over (partition by four order by ten range between unbounded preceding and current row),
661         last_value(ten) over (partition by four order by ten range between unbounded preceding and current row)
662 FROM (select distinct ten, four from tenk1) ss;
663  four | ten | sum | last_value 
664 ------+-----+-----+------------
665     0 |   0 |   0 |          0
666     0 |   2 |   2 |          2
667     0 |   4 |   6 |          4
668     0 |   6 |  12 |          6
669     0 |   8 |  20 |          8
670     1 |   1 |   1 |          1
671     1 |   3 |   4 |          3
672     1 |   5 |   9 |          5
673     1 |   7 |  16 |          7
674     1 |   9 |  25 |          9
675     2 |   0 |   0 |          0
676     2 |   2 |   2 |          2
677     2 |   4 |   6 |          4
678     2 |   6 |  12 |          6
679     2 |   8 |  20 |          8
680     3 |   1 |   1 |          1
681     3 |   3 |   4 |          3
682     3 |   5 |   9 |          5
683     3 |   7 |  16 |          7
684     3 |   9 |  25 |          9
685 (20 rows)
686
687 SELECT four, ten,
688         sum(ten) over (partition by four order by ten range between unbounded preceding and unbounded following),
689         last_value(ten) over (partition by four order by ten range between unbounded preceding and unbounded following)
690 FROM (select distinct ten, four from tenk1) ss;
691  four | ten | sum | last_value 
692 ------+-----+-----+------------
693     0 |   0 |  20 |          8
694     0 |   2 |  20 |          8
695     0 |   4 |  20 |          8
696     0 |   6 |  20 |          8
697     0 |   8 |  20 |          8
698     1 |   1 |  25 |          9
699     1 |   3 |  25 |          9
700     1 |   5 |  25 |          9
701     1 |   7 |  25 |          9
702     1 |   9 |  25 |          9
703     2 |   0 |  20 |          8
704     2 |   2 |  20 |          8
705     2 |   4 |  20 |          8
706     2 |   6 |  20 |          8
707     2 |   8 |  20 |          8
708     3 |   1 |  25 |          9
709     3 |   3 |  25 |          9
710     3 |   5 |  25 |          9
711     3 |   7 |  25 |          9
712     3 |   9 |  25 |          9
713 (20 rows)
714
715 SELECT four, ten/4 as two,
716         sum(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row),
717         last_value(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row)
718 FROM (select distinct ten, four from tenk1) ss;
719  four | two | sum | last_value 
720 ------+-----+-----+------------
721     0 |   0 |   0 |          0
722     0 |   0 |   0 |          0
723     0 |   1 |   2 |          1
724     0 |   1 |   2 |          1
725     0 |   2 |   4 |          2
726     1 |   0 |   0 |          0
727     1 |   0 |   0 |          0
728     1 |   1 |   2 |          1
729     1 |   1 |   2 |          1
730     1 |   2 |   4 |          2
731     2 |   0 |   0 |          0
732     2 |   0 |   0 |          0
733     2 |   1 |   2 |          1
734     2 |   1 |   2 |          1
735     2 |   2 |   4 |          2
736     3 |   0 |   0 |          0
737     3 |   0 |   0 |          0
738     3 |   1 |   2 |          1
739     3 |   1 |   2 |          1
740     3 |   2 |   4 |          2
741 (20 rows)
742
743 SELECT four, ten/4 as two,
744         sum(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row),
745         last_value(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row)
746 FROM (select distinct ten, four from tenk1) ss;
747  four | two | sum | last_value 
748 ------+-----+-----+------------
749     0 |   0 |   0 |          0
750     0 |   0 |   0 |          0
751     0 |   1 |   1 |          1
752     0 |   1 |   2 |          1
753     0 |   2 |   4 |          2
754     1 |   0 |   0 |          0
755     1 |   0 |   0 |          0
756     1 |   1 |   1 |          1
757     1 |   1 |   2 |          1
758     1 |   2 |   4 |          2
759     2 |   0 |   0 |          0
760     2 |   0 |   0 |          0
761     2 |   1 |   1 |          1
762     2 |   1 |   2 |          1
763     2 |   2 |   4 |          2
764     3 |   0 |   0 |          0
765     3 |   0 |   0 |          0
766     3 |   1 |   1 |          1
767     3 |   1 |   2 |          1
768     3 |   2 |   4 |          2
769 (20 rows)
770
771 SELECT sum(unique1) over (order by four range between current row and unbounded following),
772         unique1, four
773 FROM tenk1 WHERE unique1 < 10;
774  sum | unique1 | four 
775 -----+---------+------
776   45 |       0 |    0
777   45 |       8 |    0
778   45 |       4 |    0
779   33 |       5 |    1
780   33 |       9 |    1
781   33 |       1 |    1
782   18 |       6 |    2
783   18 |       2 |    2
784   10 |       3 |    3
785   10 |       7 |    3
786 (10 rows)
787
788 SELECT sum(unique1) over (rows between current row and unbounded following),
789         unique1, four
790 FROM tenk1 WHERE unique1 < 10;
791  sum | unique1 | four 
792 -----+---------+------
793   45 |       4 |    0
794   41 |       2 |    2
795   39 |       1 |    1
796   38 |       6 |    2
797   32 |       9 |    1
798   23 |       8 |    0
799   15 |       5 |    1
800   10 |       3 |    3
801    7 |       7 |    3
802    0 |       0 |    0
803 (10 rows)
804
805 SELECT sum(unique1) over (rows between 2 preceding and 2 following),
806         unique1, four
807 FROM tenk1 WHERE unique1 < 10;
808  sum | unique1 | four 
809 -----+---------+------
810    7 |       4 |    0
811   13 |       2 |    2
812   22 |       1 |    1
813   26 |       6 |    2
814   29 |       9 |    1
815   31 |       8 |    0
816   32 |       5 |    1
817   23 |       3 |    3
818   15 |       7 |    3
819   10 |       0 |    0
820 (10 rows)
821
822 SELECT sum(unique1) over (rows between 2 preceding and 1 preceding),
823         unique1, four
824 FROM tenk1 WHERE unique1 < 10;
825  sum | unique1 | four 
826 -----+---------+------
827      |       4 |    0
828    4 |       2 |    2
829    6 |       1 |    1
830    3 |       6 |    2
831    7 |       9 |    1
832   15 |       8 |    0
833   17 |       5 |    1
834   13 |       3 |    3
835    8 |       7 |    3
836   10 |       0 |    0
837 (10 rows)
838
839 SELECT sum(unique1) over (rows between 1 following and 3 following),
840         unique1, four
841 FROM tenk1 WHERE unique1 < 10;
842  sum | unique1 | four 
843 -----+---------+------
844    9 |       4 |    0
845   16 |       2 |    2
846   23 |       1 |    1
847   22 |       6 |    2
848   16 |       9 |    1
849   15 |       8 |    0
850   10 |       5 |    1
851    7 |       3 |    3
852    0 |       7 |    3
853      |       0 |    0
854 (10 rows)
855
856 SELECT sum(unique1) over (rows between unbounded preceding and 1 following),
857         unique1, four
858 FROM tenk1 WHERE unique1 < 10;
859  sum | unique1 | four 
860 -----+---------+------
861    6 |       4 |    0
862    7 |       2 |    2
863   13 |       1 |    1
864   22 |       6 |    2
865   30 |       9 |    1
866   35 |       8 |    0
867   38 |       5 |    1
868   45 |       3 |    3
869   45 |       7 |    3
870   45 |       0 |    0
871 (10 rows)
872
873 SELECT sum(unique1) over (w range between current row and unbounded following),
874         unique1, four
875 FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four);
876  sum | unique1 | four 
877 -----+---------+------
878   45 |       0 |    0
879   45 |       8 |    0
880   45 |       4 |    0
881   33 |       5 |    1
882   33 |       9 |    1
883   33 |       1 |    1
884   18 |       6 |    2
885   18 |       2 |    2
886   10 |       3 |    3
887   10 |       7 |    3
888 (10 rows)
889
890 -- fail: not implemented yet
891 SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding),
892         unique1, four
893 FROM tenk1 WHERE unique1 < 10;
894 ERROR:  RANGE PRECEDING is only supported with UNBOUNDED
895 LINE 1: SELECT sum(unique1) over (order by four range between 2::int...
896                                                 ^
897 SELECT first_value(unique1) over w,
898         nth_value(unique1, 2) over w AS nth_2,
899         last_value(unique1) over w, unique1, four
900 FROM tenk1 WHERE unique1 < 10
901 WINDOW w AS (order by four range between current row and unbounded following);
902  first_value | nth_2 | last_value | unique1 | four 
903 -------------+-------+------------+---------+------
904            0 |     8 |          7 |       0 |    0
905            0 |     8 |          7 |       8 |    0
906            0 |     8 |          7 |       4 |    0
907            5 |     9 |          7 |       5 |    1
908            5 |     9 |          7 |       9 |    1
909            5 |     9 |          7 |       1 |    1
910            6 |     2 |          7 |       6 |    2
911            6 |     2 |          7 |       2 |    2
912            3 |     7 |          7 |       3 |    3
913            3 |     7 |          7 |       7 |    3
914 (10 rows)
915
916 SELECT sum(unique1) over
917         (order by unique1
918          rows (SELECT unique1 FROM tenk1 ORDER BY unique1 LIMIT 1) + 1 PRECEDING),
919         unique1
920 FROM tenk1 WHERE unique1 < 10;
921  sum | unique1 
922 -----+---------
923    0 |       0
924    1 |       1
925    3 |       2
926    5 |       3
927    7 |       4
928    9 |       5
929   11 |       6
930   13 |       7
931   15 |       8
932   17 |       9
933 (10 rows)
934
935 CREATE TEMP VIEW v_window AS
936         SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following) as sum_rows
937         FROM generate_series(1, 10) i;
938 SELECT * FROM v_window;
939  i  | sum_rows 
940 ----+----------
941   1 |        3
942   2 |        6
943   3 |        9
944   4 |       12
945   5 |       15
946   6 |       18
947   7 |       21
948   8 |       24
949   9 |       27
950  10 |       19
951 (10 rows)
952
953 SELECT pg_get_viewdef('v_window');
954                                     pg_get_viewdef                                     
955 ---------------------------------------------------------------------------------------
956   SELECT i.i,                                                                         +
957      sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_rows+
958     FROM generate_series(1, 10) i(i);
959 (1 row)
960
961 -- with UNION
962 SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 UNION ALL SELECT * FROM tenk2)s LIMIT 0;
963  count 
964 -------
965 (0 rows)
966
967 -- ordering by a non-integer constant is allowed
968 SELECT rank() OVER (ORDER BY length('abc'));
969  rank 
970 ------
971     1
972 (1 row)
973
974 -- can't order by another window function
975 SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random()));
976 ERROR:  window functions are not allowed in window definitions
977 LINE 1: SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random())...
978                                      ^
979 -- some other errors
980 SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY salary) < 10;
981 ERROR:  window functions are not allowed in WHERE
982 LINE 1: SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY sa...
983                                       ^
984 SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVER (ORDER BY salary) < 10;
985 ERROR:  window functions are not allowed in JOIN conditions
986 LINE 1: SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVE...
987                                                     ^
988 SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GROUP BY 1;
989 ERROR:  window functions are not allowed in GROUP BY
990 LINE 1: SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GRO...
991                ^
992 SELECT * FROM rank() OVER (ORDER BY random());
993 ERROR:  syntax error at or near "ORDER"
994 LINE 1: SELECT * FROM rank() OVER (ORDER BY random());
995                                    ^
996 DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10;
997 ERROR:  window functions are not allowed in WHERE
998 LINE 1: DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())...
999                                      ^
1000 DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random());
1001 ERROR:  window functions are not allowed in RETURNING
1002 LINE 1: DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random...
1003                                         ^
1004 SELECT count(*) OVER w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY unique1);
1005 ERROR:  window "w" is already defined
1006 LINE 1: ...w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY ...
1007                                                              ^
1008 SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM tenk1;
1009 ERROR:  syntax error at or near "ORDER"
1010 LINE 1: SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM te...
1011                                                ^
1012 SELECT count() OVER () FROM tenk1;
1013 ERROR:  count(*) must be used to call a parameterless aggregate function
1014 LINE 1: SELECT count() OVER () FROM tenk1;
1015                ^
1016 SELECT generate_series(1, 100) OVER () FROM empsalary;
1017 ERROR:  OVER specified, but generate_series is not a window function nor an aggregate function
1018 LINE 1: SELECT generate_series(1, 100) OVER () FROM empsalary;
1019                ^
1020 SELECT ntile(0) OVER (ORDER BY ten), ten, four FROM tenk1;
1021 ERROR:  argument of ntile must be greater than zero
1022 SELECT nth_value(four, 0) OVER (ORDER BY ten), ten, four FROM tenk1;
1023 ERROR:  argument of nth_value must be greater than zero
1024 -- filter
1025 SELECT sum(salary), row_number() OVER (ORDER BY depname), sum(
1026     sum(salary) FILTER (WHERE enroll_date > '2007-01-01')
1027 ) FILTER (WHERE depname <> 'sales') OVER (ORDER BY depname DESC) AS "filtered_sum",
1028     depname
1029 FROM empsalary GROUP BY depname;
1030   sum  | row_number | filtered_sum |  depname  
1031 -------+------------+--------------+-----------
1032  14600 |          3 |              | sales
1033   7400 |          2 |         3500 | personnel
1034  25100 |          1 |        22600 | develop
1035 (3 rows)
1036
1037 -- cleanup
1038 DROP TABLE empsalary;
1039 -- test user-defined window function with named args and default args
1040 CREATE FUNCTION nth_value_def(val anyelement, n integer = 1) RETURNS anyelement
1041   LANGUAGE internal WINDOW IMMUTABLE STRICT AS 'window_nth_value';
1042 SELECT nth_value_def(n := 2, val := ten) OVER (PARTITION BY four), ten, four
1043   FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s;
1044  nth_value_def | ten | four 
1045 ---------------+-----+------
1046              0 |   0 |    0
1047              0 |   0 |    0
1048              0 |   4 |    0
1049              1 |   1 |    1
1050              1 |   1 |    1
1051              1 |   7 |    1
1052              1 |   9 |    1
1053                |   0 |    2
1054              3 |   1 |    3
1055              3 |   3 |    3
1056 (10 rows)
1057
1058 SELECT nth_value_def(ten) OVER (PARTITION BY four), ten, four
1059   FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s;
1060  nth_value_def | ten | four 
1061 ---------------+-----+------
1062              0 |   0 |    0
1063              0 |   0 |    0
1064              0 |   4 |    0
1065              1 |   1 |    1
1066              1 |   1 |    1
1067              1 |   7 |    1
1068              1 |   9 |    1
1069              0 |   0 |    2
1070              1 |   1 |    3
1071              1 |   3 |    3
1072 (10 rows)
1073