]> granicus.if.org Git - postgresql/blob - src/test/regress/expected/window.out
1e6365b4f9b4a37d0650b034c128823728ea2378
[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          ->  Seq Scan on tenk1
627 (3 rows)
628
629 -- test non-default frame specifications
630 SELECT four, ten,
631         sum(ten) over (partition by four order by ten),
632         last_value(ten) over (partition by four order by ten)
633 FROM (select distinct ten, four from tenk1) ss;
634  four | ten | sum | last_value 
635 ------+-----+-----+------------
636     0 |   0 |   0 |          0
637     0 |   2 |   2 |          2
638     0 |   4 |   6 |          4
639     0 |   6 |  12 |          6
640     0 |   8 |  20 |          8
641     1 |   1 |   1 |          1
642     1 |   3 |   4 |          3
643     1 |   5 |   9 |          5
644     1 |   7 |  16 |          7
645     1 |   9 |  25 |          9
646     2 |   0 |   0 |          0
647     2 |   2 |   2 |          2
648     2 |   4 |   6 |          4
649     2 |   6 |  12 |          6
650     2 |   8 |  20 |          8
651     3 |   1 |   1 |          1
652     3 |   3 |   4 |          3
653     3 |   5 |   9 |          5
654     3 |   7 |  16 |          7
655     3 |   9 |  25 |          9
656 (20 rows)
657
658 SELECT four, ten,
659         sum(ten) over (partition by four order by ten range between unbounded preceding and current row),
660         last_value(ten) over (partition by four order by ten range between unbounded preceding and current row)
661 FROM (select distinct ten, four from tenk1) ss;
662  four | ten | sum | last_value 
663 ------+-----+-----+------------
664     0 |   0 |   0 |          0
665     0 |   2 |   2 |          2
666     0 |   4 |   6 |          4
667     0 |   6 |  12 |          6
668     0 |   8 |  20 |          8
669     1 |   1 |   1 |          1
670     1 |   3 |   4 |          3
671     1 |   5 |   9 |          5
672     1 |   7 |  16 |          7
673     1 |   9 |  25 |          9
674     2 |   0 |   0 |          0
675     2 |   2 |   2 |          2
676     2 |   4 |   6 |          4
677     2 |   6 |  12 |          6
678     2 |   8 |  20 |          8
679     3 |   1 |   1 |          1
680     3 |   3 |   4 |          3
681     3 |   5 |   9 |          5
682     3 |   7 |  16 |          7
683     3 |   9 |  25 |          9
684 (20 rows)
685
686 SELECT four, ten,
687         sum(ten) over (partition by four order by ten range between unbounded preceding and unbounded following),
688         last_value(ten) over (partition by four order by ten range between unbounded preceding and unbounded following)
689 FROM (select distinct ten, four from tenk1) ss;
690  four | ten | sum | last_value 
691 ------+-----+-----+------------
692     0 |   0 |  20 |          8
693     0 |   2 |  20 |          8
694     0 |   4 |  20 |          8
695     0 |   6 |  20 |          8
696     0 |   8 |  20 |          8
697     1 |   1 |  25 |          9
698     1 |   3 |  25 |          9
699     1 |   5 |  25 |          9
700     1 |   7 |  25 |          9
701     1 |   9 |  25 |          9
702     2 |   0 |  20 |          8
703     2 |   2 |  20 |          8
704     2 |   4 |  20 |          8
705     2 |   6 |  20 |          8
706     2 |   8 |  20 |          8
707     3 |   1 |  25 |          9
708     3 |   3 |  25 |          9
709     3 |   5 |  25 |          9
710     3 |   7 |  25 |          9
711     3 |   9 |  25 |          9
712 (20 rows)
713
714 SELECT four, ten/4 as two,
715         sum(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row),
716         last_value(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row)
717 FROM (select distinct ten, four from tenk1) ss;
718  four | two | sum | last_value 
719 ------+-----+-----+------------
720     0 |   0 |   0 |          0
721     0 |   0 |   0 |          0
722     0 |   1 |   2 |          1
723     0 |   1 |   2 |          1
724     0 |   2 |   4 |          2
725     1 |   0 |   0 |          0
726     1 |   0 |   0 |          0
727     1 |   1 |   2 |          1
728     1 |   1 |   2 |          1
729     1 |   2 |   4 |          2
730     2 |   0 |   0 |          0
731     2 |   0 |   0 |          0
732     2 |   1 |   2 |          1
733     2 |   1 |   2 |          1
734     2 |   2 |   4 |          2
735     3 |   0 |   0 |          0
736     3 |   0 |   0 |          0
737     3 |   1 |   2 |          1
738     3 |   1 |   2 |          1
739     3 |   2 |   4 |          2
740 (20 rows)
741
742 SELECT four, ten/4 as two,
743         sum(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row),
744         last_value(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row)
745 FROM (select distinct ten, four from tenk1) ss;
746  four | two | sum | last_value 
747 ------+-----+-----+------------
748     0 |   0 |   0 |          0
749     0 |   0 |   0 |          0
750     0 |   1 |   1 |          1
751     0 |   1 |   2 |          1
752     0 |   2 |   4 |          2
753     1 |   0 |   0 |          0
754     1 |   0 |   0 |          0
755     1 |   1 |   1 |          1
756     1 |   1 |   2 |          1
757     1 |   2 |   4 |          2
758     2 |   0 |   0 |          0
759     2 |   0 |   0 |          0
760     2 |   1 |   1 |          1
761     2 |   1 |   2 |          1
762     2 |   2 |   4 |          2
763     3 |   0 |   0 |          0
764     3 |   0 |   0 |          0
765     3 |   1 |   1 |          1
766     3 |   1 |   2 |          1
767     3 |   2 |   4 |          2
768 (20 rows)
769
770 SELECT sum(unique1) over (order by four range between current row and unbounded following),
771         unique1, four
772 FROM tenk1 WHERE unique1 < 10;
773  sum | unique1 | four 
774 -----+---------+------
775   45 |       0 |    0
776   45 |       8 |    0
777   45 |       4 |    0
778   33 |       5 |    1
779   33 |       9 |    1
780   33 |       1 |    1
781   18 |       6 |    2
782   18 |       2 |    2
783   10 |       3 |    3
784   10 |       7 |    3
785 (10 rows)
786
787 SELECT sum(unique1) over (rows between current row and unbounded following),
788         unique1, four
789 FROM tenk1 WHERE unique1 < 10;
790  sum | unique1 | four 
791 -----+---------+------
792   45 |       4 |    0
793   41 |       2 |    2
794   39 |       1 |    1
795   38 |       6 |    2
796   32 |       9 |    1
797   23 |       8 |    0
798   15 |       5 |    1
799   10 |       3 |    3
800    7 |       7 |    3
801    0 |       0 |    0
802 (10 rows)
803
804 SELECT sum(unique1) over (rows between 2 preceding and 2 following),
805         unique1, four
806 FROM tenk1 WHERE unique1 < 10;
807  sum | unique1 | four 
808 -----+---------+------
809    7 |       4 |    0
810   13 |       2 |    2
811   22 |       1 |    1
812   26 |       6 |    2
813   29 |       9 |    1
814   31 |       8 |    0
815   32 |       5 |    1
816   23 |       3 |    3
817   15 |       7 |    3
818   10 |       0 |    0
819 (10 rows)
820
821 SELECT sum(unique1) over (rows between 2 preceding and 1 preceding),
822         unique1, four
823 FROM tenk1 WHERE unique1 < 10;
824  sum | unique1 | four 
825 -----+---------+------
826      |       4 |    0
827    4 |       2 |    2
828    6 |       1 |    1
829    3 |       6 |    2
830    7 |       9 |    1
831   15 |       8 |    0
832   17 |       5 |    1
833   13 |       3 |    3
834    8 |       7 |    3
835   10 |       0 |    0
836 (10 rows)
837
838 SELECT sum(unique1) over (rows between 1 following and 3 following),
839         unique1, four
840 FROM tenk1 WHERE unique1 < 10;
841  sum | unique1 | four 
842 -----+---------+------
843    9 |       4 |    0
844   16 |       2 |    2
845   23 |       1 |    1
846   22 |       6 |    2
847   16 |       9 |    1
848   15 |       8 |    0
849   10 |       5 |    1
850    7 |       3 |    3
851    0 |       7 |    3
852      |       0 |    0
853 (10 rows)
854
855 SELECT sum(unique1) over (rows between unbounded preceding and 1 following),
856         unique1, four
857 FROM tenk1 WHERE unique1 < 10;
858  sum | unique1 | four 
859 -----+---------+------
860    6 |       4 |    0
861    7 |       2 |    2
862   13 |       1 |    1
863   22 |       6 |    2
864   30 |       9 |    1
865   35 |       8 |    0
866   38 |       5 |    1
867   45 |       3 |    3
868   45 |       7 |    3
869   45 |       0 |    0
870 (10 rows)
871
872 SELECT sum(unique1) over (w range between current row and unbounded following),
873         unique1, four
874 FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four);
875  sum | unique1 | four 
876 -----+---------+------
877   45 |       0 |    0
878   45 |       8 |    0
879   45 |       4 |    0
880   33 |       5 |    1
881   33 |       9 |    1
882   33 |       1 |    1
883   18 |       6 |    2
884   18 |       2 |    2
885   10 |       3 |    3
886   10 |       7 |    3
887 (10 rows)
888
889 -- fail: not implemented yet
890 SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding),
891         unique1, four
892 FROM tenk1 WHERE unique1 < 10;
893 ERROR:  RANGE PRECEDING is only supported with UNBOUNDED
894 LINE 1: SELECT sum(unique1) over (order by four range between 2::int...
895                                                 ^
896 SELECT first_value(unique1) over w,
897         nth_value(unique1, 2) over w AS nth_2,
898         last_value(unique1) over w, unique1, four
899 FROM tenk1 WHERE unique1 < 10
900 WINDOW w AS (order by four range between current row and unbounded following);
901  first_value | nth_2 | last_value | unique1 | four 
902 -------------+-------+------------+---------+------
903            0 |     8 |          7 |       0 |    0
904            0 |     8 |          7 |       8 |    0
905            0 |     8 |          7 |       4 |    0
906            5 |     9 |          7 |       5 |    1
907            5 |     9 |          7 |       9 |    1
908            5 |     9 |          7 |       1 |    1
909            6 |     2 |          7 |       6 |    2
910            6 |     2 |          7 |       2 |    2
911            3 |     7 |          7 |       3 |    3
912            3 |     7 |          7 |       7 |    3
913 (10 rows)
914
915 SELECT sum(unique1) over
916         (order by unique1
917          rows (SELECT unique1 FROM tenk1 ORDER BY unique1 LIMIT 1) + 1 PRECEDING),
918         unique1
919 FROM tenk1 WHERE unique1 < 10;
920  sum | unique1 
921 -----+---------
922    0 |       0
923    1 |       1
924    3 |       2
925    5 |       3
926    7 |       4
927    9 |       5
928   11 |       6
929   13 |       7
930   15 |       8
931   17 |       9
932 (10 rows)
933
934 CREATE TEMP VIEW v_window AS
935         SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following) as sum_rows
936         FROM generate_series(1, 10) i;
937 SELECT * FROM v_window;
938  i  | sum_rows 
939 ----+----------
940   1 |        3
941   2 |        6
942   3 |        9
943   4 |       12
944   5 |       15
945   6 |       18
946   7 |       21
947   8 |       24
948   9 |       27
949  10 |       19
950 (10 rows)
951
952 SELECT pg_get_viewdef('v_window');
953                                     pg_get_viewdef                                     
954 ---------------------------------------------------------------------------------------
955   SELECT i.i,                                                                         +
956      sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_rows+
957     FROM generate_series(1, 10) i(i);
958 (1 row)
959
960 -- with UNION
961 SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 UNION ALL SELECT * FROM tenk2)s LIMIT 0;
962  count 
963 -------
964 (0 rows)
965
966 -- ordering by a non-integer constant is allowed
967 SELECT rank() OVER (ORDER BY length('abc'));
968  rank 
969 ------
970     1
971 (1 row)
972
973 -- can't order by another window function
974 SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random()));
975 ERROR:  window functions are not allowed in window definitions
976 LINE 1: SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random())...
977                                      ^
978 -- some other errors
979 SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY salary) < 10;
980 ERROR:  window functions are not allowed in WHERE
981 LINE 1: SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY sa...
982                                       ^
983 SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVER (ORDER BY salary) < 10;
984 ERROR:  window functions are not allowed in JOIN conditions
985 LINE 1: SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVE...
986                                                     ^
987 SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GROUP BY 1;
988 ERROR:  window functions are not allowed in GROUP BY
989 LINE 1: SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GRO...
990                ^
991 SELECT * FROM rank() OVER (ORDER BY random());
992 ERROR:  syntax error at or near "ORDER"
993 LINE 1: SELECT * FROM rank() OVER (ORDER BY random());
994                                    ^
995 DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10;
996 ERROR:  window functions are not allowed in WHERE
997 LINE 1: DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())...
998                                      ^
999 DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random());
1000 ERROR:  window functions are not allowed in RETURNING
1001 LINE 1: DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random...
1002                                         ^
1003 SELECT count(*) OVER w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY unique1);
1004 ERROR:  window "w" is already defined
1005 LINE 1: ...w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY ...
1006                                                              ^
1007 SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM tenk1;
1008 ERROR:  syntax error at or near "ORDER"
1009 LINE 1: SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM te...
1010                                                ^
1011 SELECT count() OVER () FROM tenk1;
1012 ERROR:  count(*) must be used to call a parameterless aggregate function
1013 LINE 1: SELECT count() OVER () FROM tenk1;
1014                ^
1015 SELECT generate_series(1, 100) OVER () FROM empsalary;
1016 ERROR:  OVER specified, but generate_series is not a window function nor an aggregate function
1017 LINE 1: SELECT generate_series(1, 100) OVER () FROM empsalary;
1018                ^
1019 SELECT ntile(0) OVER (ORDER BY ten), ten, four FROM tenk1;
1020 ERROR:  argument of ntile must be greater than zero
1021 SELECT nth_value(four, 0) OVER (ORDER BY ten), ten, four FROM tenk1;
1022 ERROR:  argument of nth_value must be greater than zero
1023 -- filter
1024 SELECT sum(salary), row_number() OVER (ORDER BY depname), sum(
1025     sum(salary) FILTER (WHERE enroll_date > '2007-01-01')
1026 ) FILTER (WHERE depname <> 'sales') OVER (ORDER BY depname DESC) AS "filtered_sum",
1027     depname
1028 FROM empsalary GROUP BY depname;
1029   sum  | row_number | filtered_sum |  depname  
1030 -------+------------+--------------+-----------
1031  14600 |          3 |              | sales
1032   7400 |          2 |         3500 | personnel
1033  25100 |          1 |        22600 | develop
1034 (3 rows)
1035
1036 -- cleanup
1037 DROP TABLE empsalary;
1038 -- test user-defined window function with named args and default args
1039 CREATE FUNCTION nth_value_def(val anyelement, n integer = 1) RETURNS anyelement
1040   LANGUAGE internal WINDOW IMMUTABLE STRICT AS 'window_nth_value';
1041 SELECT nth_value_def(n := 2, val := ten) OVER (PARTITION BY four), ten, four
1042   FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s;
1043  nth_value_def | ten | four 
1044 ---------------+-----+------
1045              0 |   0 |    0
1046              0 |   0 |    0
1047              0 |   4 |    0
1048              1 |   1 |    1
1049              1 |   1 |    1
1050              1 |   7 |    1
1051              1 |   9 |    1
1052                |   0 |    2
1053              3 |   1 |    3
1054              3 |   3 |    3
1055 (10 rows)
1056
1057 SELECT nth_value_def(ten) OVER (PARTITION BY four), ten, four
1058   FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s;
1059  nth_value_def | ten | four 
1060 ---------------+-----+------
1061              0 |   0 |    0
1062              0 |   0 |    0
1063              0 |   4 |    0
1064              1 |   1 |    1
1065              1 |   1 |    1
1066              1 |   7 |    1
1067              1 |   9 |    1
1068              0 |   0 |    2
1069              1 |   1 |    3
1070              1 |   3 |    3
1071 (10 rows)
1072