5
CREATE TEMPORARY TABLE empsalary (
12
INSERT INTO empsalary VALUES
13
('develop', 10, 5200, '2007-08-01'),
14
('sales', 1, 5000, '2006-10-01'),
15
('personnel', 5, 3500, '2007-12-10'),
16
('sales', 4, 4800, '2007-08-08'),
17
('personnel', 2, 3900, '2006-12-23'),
18
('develop', 7, 4200, '2008-01-01'),
19
('develop', 9, 4500, '2008-01-01'),
20
('sales', 3, 4800, '2007-08-01'),
21
('develop', 8, 6000, '2006-10-01'),
22
('develop', 11, 5200, '2007-08-15');
24
SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary ORDER BY depname, salary;
26
SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary) FROM empsalary;
29
SELECT four, ten, SUM(SUM(four)) OVER (PARTITION BY four), AVG(ten) FROM tenk1
30
GROUP BY four, ten ORDER BY four, ten;
32
SELECT depname, empno, salary, sum(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname);
34
SELECT depname, empno, salary, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary) ORDER BY rank() OVER w;
36
-- empty window specification
37
SELECT COUNT(*) OVER () FROM tenk1 WHERE unique2 < 10;
39
SELECT COUNT(*) OVER w FROM tenk1 WHERE unique2 < 10 WINDOW w AS ();
41
-- no window operation
42
SELECT four FROM tenk1 WHERE FALSE WINDOW w AS (PARTITION BY ten);
44
-- cumulative aggregate
45
SELECT sum(four) OVER (PARTITION BY ten ORDER BY unique2) AS sum_1, ten, four FROM tenk1 WHERE unique2 < 10;
47
SELECT row_number() OVER (ORDER BY unique2) FROM tenk1 WHERE unique2 < 10;
49
SELECT rank() OVER (PARTITION BY four ORDER BY ten) AS rank_1, ten, four FROM tenk1 WHERE unique2 < 10;
51
SELECT dense_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
53
SELECT percent_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
55
SELECT cume_dist() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
57
SELECT ntile(3) OVER (ORDER BY ten, four), ten, four FROM tenk1 WHERE unique2 < 10;
59
SELECT ntile(NULL) OVER (ORDER BY ten, four), ten, four FROM tenk1 LIMIT 2;
61
SELECT lag(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
63
SELECT lag(ten, four) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
65
SELECT lag(ten, four, 0) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
67
SELECT lead(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
69
SELECT lead(ten * 2, 1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
71
SELECT lead(ten * 2, 1, -1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
73
SELECT first_value(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
75
-- last_value returns the last row of the frame, which is CURRENT ROW in ORDER BY window.
76
SELECT last_value(four) OVER (ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
78
SELECT last_value(ten) OVER (PARTITION BY four), ten, four FROM
79
(SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s
82
SELECT nth_value(ten, four + 1) OVER (PARTITION BY four), ten, four
83
FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s;
85
SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER (PARTITION BY two ORDER BY ten) AS wsum
86
FROM tenk1 GROUP BY ten, two;
88
SELECT count(*) OVER (PARTITION BY four), four FROM (SELECT * FROM tenk1 WHERE two = 1)s WHERE unique2 < 10;
90
SELECT (count(*) OVER (PARTITION BY four ORDER BY ten) +
91
sum(hundred) OVER (PARTITION BY four ORDER BY ten))::varchar AS cntsum
92
FROM tenk1 WHERE unique2 < 10;
94
-- opexpr with different windows evaluation.
96
SELECT count(*) OVER (PARTITION BY four ORDER BY ten) +
97
sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS total,
98
count(*) OVER (PARTITION BY four ORDER BY ten) AS fourcount,
99
sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS twosum
102
WHERE total <> fourcount + twosum;
104
SELECT avg(four) OVER (PARTITION BY four ORDER BY thousand / 100) FROM tenk1 WHERE unique2 < 10;
106
SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER win AS wsum
107
FROM tenk1 GROUP BY ten, two WINDOW win AS (PARTITION BY two ORDER BY ten);
109
-- more than one window with GROUP BY
111
row_number() OVER (ORDER BY depname),
112
sum(sum(salary)) OVER (ORDER BY depname DESC)
113
FROM empsalary GROUP BY depname;
115
-- identical windows with different names
116
SELECT sum(salary) OVER w1, count(*) OVER w2
117
FROM empsalary WINDOW w1 AS (ORDER BY salary), w2 AS (ORDER BY salary);
120
SELECT lead(ten, (SELECT two FROM tenk1 WHERE s.unique2 = unique2)) OVER (PARTITION BY four ORDER BY ten)
121
FROM tenk1 s WHERE unique2 < 10;
124
SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 WHERE FALSE)s;
126
-- mixture of agg/wfunc in the same window
127
SELECT sum(salary) OVER w, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
130
SELECT empno, depname, salary, bonus, depadj, MIN(bonus) OVER (ORDER BY empno), MAX(depadj) OVER () FROM(
132
CASE WHEN enroll_date < '2008-01-01' THEN 2008 - extract(YEAR FROM enroll_date) END * 500 AS bonus,
134
AVG(salary) OVER (PARTITION BY depname) < salary
135
THEN 200 END AS depadj FROM empsalary
138
-- test non-default frame specifications
140
sum(ten) over (partition by four order by ten),
141
last_value(ten) over (partition by four order by ten)
142
FROM (select distinct ten, four from tenk1) ss;
145
sum(ten) over (partition by four order by ten range between unbounded preceding and current row),
146
last_value(ten) over (partition by four order by ten range between unbounded preceding and current row)
147
FROM (select distinct ten, four from tenk1) ss;
150
sum(ten) over (partition by four order by ten range between unbounded preceding and unbounded following),
151
last_value(ten) over (partition by four order by ten range between unbounded preceding and unbounded following)
152
FROM (select distinct ten, four from tenk1) ss;
154
SELECT four, ten/4 as two,
155
sum(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row),
156
last_value(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row)
157
FROM (select distinct ten, four from tenk1) ss;
159
SELECT four, ten/4 as two,
160
sum(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row),
161
last_value(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row)
162
FROM (select distinct ten, four from tenk1) ss;
165
SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 UNION ALL SELECT * FROM tenk2)s LIMIT 0;
167
-- ordering by a non-integer constant is allowed
168
SELECT rank() OVER (ORDER BY length('abc'));
170
-- but this draws an error: "ORDER BY 1" means order by first SELECT column
171
SELECT rank() OVER (ORDER BY 1);
174
SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY salary) < 10;
176
SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVER (ORDER BY salary) < 10;
178
SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GROUP BY 1;
180
SELECT * FROM rank() OVER (ORDER BY random());
182
DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10;
184
DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random());
186
SELECT count(*) OVER w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY unique1);
188
SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM tenk1;
190
SELECT count() OVER () FROM tenk1;
192
SELECT generate_series(1, 100) OVER () FROM empsalary;
194
SELECT ntile(0) OVER (ORDER BY ten), ten, four FROM tenk1;
196
SELECT nth_value(four, 0) OVER (ORDER BY ten), ten, four FROM tenk1;
199
DROP TABLE empsalary;