On Tuesday, April 14, 2026, Peter Eisentraut <
peter@eisentraut.org> wrote:
I don't see any mention of using GROUP BY with window functions in our relevant documentation, for example
https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS
https://www.postgresql.org/docs/devel/functions-window.html
The select reference page covers this. But the window clause could get better treatment, it’s buried in step 5.
Commit ef38a4d9756 added a regression test
EXPLAIN (COSTS OFF) SELECT a, COUNT(a) OVER (PARTITION BY a) FROM t1 GROUP BY ALL;
but the test table contains no data, so I don't know if this kind of query produces interesting information.
Each non-null value of “a” would have an output of 1, while a null valued “a” would have an output of 0. “A” is grouped since all expressions involving “a” are non-aggregated. The equivalent rewrite is:
Select a, count(a_expr) over … from ( — step 5
select a, a as a_expr from tbl group by all. — step 4
);
For purposes of group by all one would erase/ignore the actual window wrapper while leaving the expressions it operates over in place. This extends from “window expressions are processed after group by/having” documented in SELECT. IOW, group by all resolves during processing step 4 with intermediate results for the expressions within the window functions, then step 5 removes the intermediate expressions that don’t appear in the final output while adding in the results of processing the window functions.
David J.