create table xc_groupby_tab2 (val int, val2 int);
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
count | sum | avg | ?column? | val2
-------+-----+--------------------+------------------+------
+ 2 | 8 | 4.0000000000000000 | 4 | 2
3 | 6 | 2.0000000000000000 | 2 | 1
3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
- 2 | 8 | 4.0000000000000000 | 4 | 2
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------
+ Sort
+ Output: (count(*)), (sum(val)), (avg(val)), (((sum(val))::double precision / (count(*))::double precision)), val2
+ Sort Key: (count(*)), (sum(xc_groupby_tab1.val))
+ -> Finalize HashAggregate
+ Output: count(*), sum(val), avg(val), ((sum(val))::double precision / (count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ -> Partial HashAggregate
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(13 rows)
+
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
(4 rows)
explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GroupAggregate
- Output: pg_catalog.count(*), pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))), pg_catalog.avg((avg((xc_groupby_tab1.val * xc_groupby_tab2.val)))), ((pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))))::double precision / (pg_catalog.count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), ((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))::double precision / (count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
-> Remote Subquery Scan on all
- Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> GroupAggregate
- Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
- Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Merge Full Join
Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
- Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> Merge Full Join
- Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
- Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Distribute results by H: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Materialize
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
-> Remote Subquery Scan on all
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
Distribute results by H: val2
+ Sort Key: xc_groupby_tab2.val2
-> Sort
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
- Sort Key: xc_groupby_tab1.val2
- -> Seq Scan on public.xc_groupby_tab1
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
- -> Materialize
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- -> Remote Subquery Scan on all
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- Distribute results by H: val2
- -> Sort
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- Sort Key: xc_groupby_tab2.val2
- -> Seq Scan on public.xc_groupby_tab2
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab2.val2
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
(32 rows)
-- aggregates over aggregates
-select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x order by 1;
sum
-----
- 17
8
+ 17
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x order by 1;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------
+ Sort
+ Output: (sum((sum(xc_groupby_tab1.val)))), ((xc_groupby_tab1.val2 % 2))
+ Sort Key: (sum((sum(xc_groupby_tab1.val))))
+ -> HashAggregate
+ Output: sum((sum(xc_groupby_tab1.val))), ((xc_groupby_tab1.val2 % 2))
+ Group Key: (xc_groupby_tab1.val2 % 2)
+ -> Finalize HashAggregate
+ Output: sum(xc_groupby_tab1.val), (xc_groupby_tab1.val2 % 2), xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab1.val2, PARTIAL sum(xc_groupby_tab1.val)
+ -> Partial HashAggregate
+ Output: xc_groupby_tab1.val2, PARTIAL sum(xc_groupby_tab1.val)
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+(16 rows)
+
explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
QUERY PLAN
--------------------------------------------------------------------------------------------
(13 rows)
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by val2;
val2
------
1
- 3
2
+ 3
(3 rows)
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by val2;
+ QUERY PLAN
+------------------------------------------------------------
+ Finalize GroupAggregate
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Partial HashAggregate
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(14 rows)
+
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
------------------------------------------------------
Output: val, val2
(10 rows)
-select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
?column?
----------
- 8
- 4
- 3
- 9
2
+ 3
+ 4
7
+ 8
+ 9
(6 rows)
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
+ QUERY PLAN
+-----------------------------------------------------------------------------
+ Finalize GroupAggregate
+ Output: ((val + val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: (val + val2)
+ Sort Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Sort
+ Output: ((val + val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Partial HashAggregate
+ Output: ((val + val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (val + val2)
+(14 rows)
+
explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
QUERY PLAN
-----------------------------------------------------------------------
Output: (val + val2)
(10 rows)
-select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2, 3;
?column? | val | val2
----------+-----+------
- 8 | 6 | 2
- 4 | 2 | 2
- 4 | 1 | 3
- 9 | 6 | 3
- 3 | 2 | 1
2 | 1 | 1
+ 3 | 2 | 1
+ 4 | 1 | 3
+ 4 | 2 | 2
4 | 3 | 1
7 | 4 | 3
+ 8 | 6 | 2
+ 9 | 6 | 3
(8 rows)
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: (val + val2), val, val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Sort
+ Output: ((val + val2)), val, val2
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2)), xc_groupby_tab1.val
+ -> HashAggregate
+ Output: (val + val2), val, val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(11 rows)
+
explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
QUERY PLAN
--------------------------------------------------------------
Output: val, val2
(8 rows)
-select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by 1, 2, 3;
?column? | val | val2
----------+-----+------
- 6 | 2 | 4
2 | 1 | 1
- 6 | 4 | 2
- 7 | 3 | 4
5 | 3 | 2
5 | 4 | 1
+ 6 | 2 | 4
+ 6 | 4 | 2
+ 7 | 3 | 4
(6 rows)
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
(19 rows)
-select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
?column?
----------
- 5
- 7
2
+ 5
6
+ 7
(4 rows)
-explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
QUERY PLAN
-----------------------------------------------------------------------------------
- HashAggregate
+ Group
Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
-> Remote Subquery Scan on all
Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
- -> HashAggregate
+ Sort Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Sort
Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
-> Merge Join
Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
Sort Key: xc_groupby_tab2.val
-> Seq Scan on public.xc_groupby_tab2
Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
-(21 rows)
+(22 rows)
+
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------
+ HashAggregate
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Merge Join
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(18 rows)
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
?column? | val2
---------------------+------
11.0000000000000000 | 1
- 17.6666666666666667 | 3
14.0000000000000000 | 2
+ 17.6666666666666667 | 3
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
+ Sort
+ Output: ((((count(*) + sum(val)))::numeric + avg(val))), val2
+ Sort Key: ((((count(*) + sum(xc_groupby_tab1.val)))::numeric + avg(xc_groupby_tab1.val)))
+ -> Finalize HashAggregate
+ Output: (((count(*) + sum(val)))::numeric + avg(val)), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ -> Partial HashAggregate
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(13 rows)
+
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
----------------------------------------------------------------------------------
(10 rows)
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 1;
sum | avg | ?column?
-----+--------------------+----------
+ 6 | 2.0000000000000000 | 2
8 | 4.0000000000000000 | 4
11 | 3.6666666666666667 | 6
- 6 | 2.0000000000000000 | 2
(3 rows)
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 1;
+ QUERY PLAN
+------------------------------------------------------------------------------
+ Sort
+ Output: (sum(val)), (avg(val)), ((2 * val2))
+ Sort Key: (sum(xc_groupby_tab1.val))
+ -> Finalize HashAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: (2 * val2), PARTIAL sum(val), PARTIAL avg(val)
+ -> Partial HashAggregate
+ Output: ((2 * val2)), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(13 rows)
+
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
QUERY PLAN
------------------------------------------------------------------------
Output: a, b
(11 rows)
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
avg
------------------------
-
- 8.0000000000000000
1.00000000000000000000
- 5.0000000000000000
- 9.0000000000000000
- 6.0000000000000000
2.0000000000000000
- 4.0000000000000000
3.0000000000000000
- 10.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
+ 6.0000000000000000
7.0000000000000000
-(11 rows)
-
-select avg(a) from xc_groupby_def group by a;
- avg
-------------------------
-
8.0000000000000000
- 1.00000000000000000000
- 5.0000000000000000
9.0000000000000000
- 6.0000000000000000
- 2.0000000000000000
- 4.0000000000000000
- 3.0000000000000000
10.0000000000000000
- 7.0000000000000000
+
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(a), a
+ Sort Key: xc_groupby_def.a
+ -> Sort
+ Output: (avg(a)), a
+ Sort Key: (avg(xc_groupby_def.a))
+ -> HashAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
(11 rows)
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
Output: a, b
(8 rows)
-select avg(a) from xc_groupby_def group by b;
+select avg(a) from xc_groupby_def group by b order by 1;
avg
--------------------
4.0000000000000000
(4 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------------
+ Sort
+ Output: (avg(a)), b
+ Sort Key: (avg(xc_groupby_def.a))
+ -> Finalize HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL avg(a)
+ -> Partial HashAggregate
+ Output: b, PARTIAL avg(a)
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(13 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------------
Output: a, b
(10 rows)
-select sum(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b order by 1;
sum
-----
8
(4 rows)
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------------
+ Sort
+ Output: (sum(a)), b
+ Sort Key: (sum(xc_groupby_def.a))
+ -> Finalize HashAggregate
+ Output: sum(a), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL sum(a)
+ -> Partial HashAggregate
+ Output: b, PARTIAL sum(a)
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(13 rows)
+
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------------
Output: a, b
(10 rows)
-select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b order by 1;
count
-------
+ 1
3
4
5
- 1
(4 rows)
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------------
+ Sort
+ Output: (count(*)), b
+ Sort Key: (count(*))
+ -> Finalize HashAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL count(*)
+ -> Partial HashAggregate
+ Output: b, PARTIAL count(*)
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(13 rows)
+
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------------
Output: a, b
(10 rows)
-select count(*) from xc_groupby_def where a is not null group by a;
+select count(*) from xc_groupby_def where a is not null group by a order by 1;
count
-------
1
1
1
1
- 2
1
1
1
1
+ 2
(10 rows)
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
QUERY PLAN
--------------------------------------------------------
- HashAggregate
- Output: pg_catalog.count(*), b
+ GroupAggregate
+ Output: count(*), b
Group Key: xc_groupby_def.b
-> Remote Subquery Scan on all
- Output: count(*), b
- -> HashAggregate
- Output: count(*), b
- Group Key: xc_groupby_def.b
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
-> Seq Scan on public.xc_groupby_def
- Output: a, b
+ Output: b
Filter: (xc_groupby_def.b IS NULL)
-(11 rows)
+(12 rows)
create table xc_groupby_g(a int, b float, c numeric);
insert into xc_groupby_g values(1,2.1,3.2);
Output: a, b, c
(8 rows)
-select sum(b) from xc_groupby_g group by b;
+select sum(b) from xc_groupby_g group by b order by 1;
sum
-----
- 4.2
2.3
+ 4.2
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (sum(b)), b
+ Sort Key: (sum(xc_groupby_g.b))
+ -> Finalize HashAggregate
+ Output: sum(b), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL sum(b)
+ -> Partial HashAggregate
+ Output: b, PARTIAL sum(b)
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------------
Output: a, b, c
(10 rows)
-select sum(c) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b order by 1;
sum
-----
- 6.4
5.2
+ 6.4
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (sum(c)), b
+ Sort Key: (sum(xc_groupby_g.c))
+ -> Finalize HashAggregate
+ Output: sum(c), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL sum(c)
+ -> Partial HashAggregate
+ Output: b, PARTIAL sum(c)
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------------
Output: a, b, c
(10 rows)
-select avg(a) from xc_groupby_g group by b;
+select avg(a) from xc_groupby_g group by b order by 1;
avg
------------------------
1.00000000000000000000
2.0000000000000000
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (avg(a)), b
+ Sort Key: (avg(xc_groupby_g.a))
+ -> Finalize HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL avg(a)
+ -> Partial HashAggregate
+ Output: b, PARTIAL avg(a)
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------------
Output: a, b, c
(10 rows)
-select avg(b) from xc_groupby_g group by c;
+select avg(b) from xc_groupby_g group by c order by 1;
avg
-----
- 2.3
2.1
+ 2.3
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (avg(b)), c
+ Sort Key: (avg(xc_groupby_g.b))
+ -> Finalize HashAggregate
+ Output: avg(b), c
+ Group Key: xc_groupby_g.c
+ -> Remote Subquery Scan on all
+ Output: c, PARTIAL avg(b)
+ -> Partial HashAggregate
+ Output: c, PARTIAL avg(b)
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
QUERY PLAN
---------------------------------------------------
Output: a, b, c
(10 rows)
-select avg(c) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c order by 1;
avg
--------------------
- 5.2000000000000000
3.2000000000000000
+ 5.2000000000000000
(2 rows)
-explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
- QUERY PLAN
----------------------------------------------------
- Finalize HashAggregate
- Output: avg(c), c
- Group Key: xc_groupby_g.c
- -> Remote Subquery Scan on all
- Output: c, PARTIAL avg(c)
- -> Partial HashAggregate
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (avg(c)), c
+ Sort Key: (avg(xc_groupby_g.c))
+ -> Finalize HashAggregate
+ Output: avg(c), c
+ Group Key: xc_groupby_g.c
+ -> Remote Subquery Scan on all
Output: c, PARTIAL avg(c)
- Group Key: xc_groupby_g.c
- -> Seq Scan on public.xc_groupby_g
- Output: a, b, c
-(10 rows)
+ -> Partial HashAggregate
+ Output: c, PARTIAL avg(c)
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
drop table xc_groupby_def;
drop table xc_groupby_g;
create table xc_groupby_tab2 (val int, val2 int) distribute by replication;
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2, 3;
count | sum | avg | ?column? | val2
-------+-----+--------------------+------------------+------
+ 2 | 8 | 4.0000000000000000 | 4 | 2
3 | 6 | 2.0000000000000000 | 2 | 1
3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
- 2 | 8 | 4.0000000000000000 | 4 | 2
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2, 3;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: count(*), sum(val), avg(val), ((sum(val))::double precision / (count(*))::double precision), val2
+ -> Sort
+ Output: (count(*)), (sum(val)), (avg(val)), (((sum(val))::double precision / (count(*))::double precision)), val2
+ Sort Key: (count(*)), (sum(xc_groupby_tab1.val)), (avg(xc_groupby_tab1.val))
+ -> HashAggregate
+ Output: count(*), sum(val), avg(val), ((sum(val))::double precision / (count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(10 rows)
+
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
(15 rows)
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by 1;
val2
------
1
- 3
2
+ 3
(3 rows)
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by 1;
+ QUERY PLAN
+------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: val2
+ -> Sort
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> HashAggregate
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(10 rows)
+
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
------------------------------------------------
(6 rows)
explain (verbose true, costs false, nodes false) select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2) q order by q.val, q.val2;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------
Remote Subquery Scan on all
Output: "?column?", val, val2
- -> Sort
- Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2)), xc_groupby_tab1.val, xc_groupby_tab2.val2
- Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
- -> HashAggregate
- Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
- Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Group
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
-> Merge Join
Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
-----------------------------------------------------------------------------------
Remote Subquery Scan on all
Output: sum
- -> Sort
+ -> Group
Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- -> HashAggregate
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ -> Sort
Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
-> Merge Join
Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
(21 rows)
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by val2;
?column? | val2
---------------------+------
11.0000000000000000 | 1
- 17.6666666666666667 | 3
14.0000000000000000 | 2
+ 17.6666666666666667 | 3
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by val2;
+ QUERY PLAN
+---------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: (((count(*) + sum(val)))::numeric + avg(val)), val2
+ -> Sort
+ Output: ((((count(*) + sum(val)))::numeric + avg(val))), val2
+ Sort Key: xc_groupby_tab1.val2
+ -> HashAggregate
+ Output: (((count(*) + sum(val)))::numeric + avg(val)), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(10 rows)
+
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
---------------------------------------------------------------------
(7 rows)
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 2 * val2;
sum | avg | ?column?
-----+--------------------+----------
+ 6 | 2.0000000000000000 | 2
8 | 4.0000000000000000 | 4
11 | 3.6666666666666667 | 6
- 6 | 2.0000000000000000 | 2
(3 rows)
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 2 * val2;
+ QUERY PLAN
+--------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum(val), avg(val), (2 * val2)
+ -> Sort
+ Output: (sum(val)), (avg(val)), ((2 * val2))
+ Sort Key: ((2 * xc_groupby_tab1.val2))
+ -> HashAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(10 rows)
+
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
QUERY PLAN
--------------------------------------------------
Output: a, b
(10 rows)
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
avg
------------------------
-
- 8.0000000000000000
- 4.0000000000000000
1.00000000000000000000
- 5.0000000000000000
+ 2.0000000000000000
3.0000000000000000
- 10.0000000000000000
- 9.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
6.0000000000000000
- 2.0000000000000000
7.0000000000000000
+ 8.0000000000000000
+ 9.0000000000000000
+ 10.0000000000000000
+
(11 rows)
-explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(a), a
+ -> Sort
+ Output: (avg(a)), a
+ Sort Key: (avg(xc_groupby_def.a))
+ -> HashAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
QUERY PLAN
-----------------------------------------------
Remote Subquery Scan on all
Output: a, b
(7 rows)
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
avg
------------------------
-
- 8.0000000000000000
- 4.0000000000000000
1.00000000000000000000
- 5.0000000000000000
+ 2.0000000000000000
3.0000000000000000
- 10.0000000000000000
- 9.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
6.0000000000000000
- 2.0000000000000000
7.0000000000000000
+ 8.0000000000000000
+ 9.0000000000000000
+ 10.0000000000000000
+
(11 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(a), a
+ -> Sort
+ Output: (avg(a)), a
+ Sort Key: (avg(xc_groupby_def.a))
+ -> HashAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
QUERY PLAN
-----------------------------------------------
Output: a, b
(7 rows)
-select avg(a) from xc_groupby_def group by b;
+select avg(a) from xc_groupby_def group by b order by 1;
avg
--------------------
4.0000000000000000
(4 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(a), b
+ -> Sort
+ Output: (avg(a)), b
+ Sort Key: (avg(xc_groupby_def.a))
+ -> HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------
Output: a, b
(7 rows)
-select sum(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b order by 1;
sum
-----
8
(4 rows)
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum(a), b
+ -> Sort
+ Output: (sum(a)), b
+ Sort Key: (sum(xc_groupby_def.a))
+ -> HashAggregate
+ Output: sum(a), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------
Output: a, b
(7 rows)
-select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b order by 1;
count
-------
+ 1
3
4
5
- 1
(4 rows)
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: count(*), b
+ -> Sort
+ Output: (count(*)), b
+ Sort Key: (count(*))
+ -> HashAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------
Output: a, b
(7 rows)
-select count(*) from xc_groupby_def where a is not null group by a;
+select count(*) from xc_groupby_def where a is not null group by a order by 1;
count
-------
1
1
1
1
- 2
1
+ 2
(10 rows)
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a order by 1;
+ QUERY PLAN
+------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: count(*), a
+ -> Sort
+ Output: (count(*)), a
+ Sort Key: (count(*))
+ -> HashAggregate
+ Output: count(*), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+ Filter: (xc_groupby_def.a IS NOT NULL)
+(11 rows)
+
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
QUERY PLAN
------------------------------------------------------
(1 row)
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
- QUERY PLAN
---------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------
Remote Subquery Scan on all
Output: count(*), b
- -> HashAggregate
+ -> GroupAggregate
Output: count(*), b
Group Key: xc_groupby_def.b
- -> Seq Scan on public.xc_groupby_def
- Output: a, b
- Filter: (xc_groupby_def.b IS NULL)
-(8 rows)
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+ Filter: (xc_groupby_def.b IS NULL)
+(11 rows)
create table xc_groupby_g(a int, b float, c numeric) distribute by replication;
insert into xc_groupby_g values(1,2.1,3.2);
Output: a, b, c
(7 rows)
-select sum(b) from xc_groupby_g group by b;
+select sum(b) from xc_groupby_g group by b order by 1;
sum
-----
- 4.2
2.3
+ 4.2
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum(b), b
+ -> Sort
+ Output: (sum(b)), b
+ Sort Key: (sum(xc_groupby_g.b))
+ -> HashAggregate
+ Output: sum(b), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------
Output: a, b, c
(7 rows)
-select sum(c) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b order by 1;
sum
-----
- 6.4
5.2
+ 6.4
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum(c), b
+ -> Sort
+ Output: (sum(c)), b
+ Sort Key: (sum(xc_groupby_g.c))
+ -> HashAggregate
+ Output: sum(c), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------
Output: a, b, c
(7 rows)
-select avg(a) from xc_groupby_g group by b;
+select avg(a) from xc_groupby_g group by b order by 1;
avg
------------------------
1.00000000000000000000
2.0000000000000000
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(a), b
+ -> Sort
+ Output: (avg(a)), b
+ Sort Key: (avg(xc_groupby_g.a))
+ -> HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------
Output: a, b, c
(7 rows)
-select avg(b) from xc_groupby_g group by c;
+select avg(b) from xc_groupby_g group by c order by 1;
avg
-----
- 2.3
2.1
+ 2.3
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c order by 1;
+ QUERY PLAN
+---------------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(b), c
+ -> Sort
+ Output: (avg(b)), c
+ Sort Key: (avg(xc_groupby_g.b))
+ -> HashAggregate
+ Output: avg(b), c
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
QUERY PLAN
---------------------------------------------
Output: a, b, c
(7 rows)
-select avg(c) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c order by 1;
avg
--------------------
- 5.2000000000000000
3.2000000000000000
+ 5.2000000000000000
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c order by 1;
+ QUERY PLAN
+---------------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(c), c
+ -> Sort
+ Output: (avg(c)), c
+ Sort Key: (avg(xc_groupby_g.c))
+ -> HashAggregate
+ Output: avg(c), c
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
QUERY PLAN
---------------------------------------------
(4 rows)
explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GroupAggregate
- Output: pg_catalog.count(*), pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))), pg_catalog.avg((avg((xc_groupby_tab1.val * xc_groupby_tab2.val)))), ((pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))))::double precision / (pg_catalog.count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), ((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))::double precision / (count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
-> Remote Subquery Scan on all
- Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> GroupAggregate
- Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
- Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Merge Full Join
Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
- Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> Merge Full Join
- Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
- Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Distribute results by H: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Materialize
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
-> Remote Subquery Scan on all
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
Distribute results by H: val2
+ Sort Key: xc_groupby_tab2.val2
-> Sort
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
- Sort Key: xc_groupby_tab1.val2
- -> Seq Scan on public.xc_groupby_tab1
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
- -> Materialize
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- -> Remote Subquery Scan on all
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- Distribute results by H: val2
- -> Sort
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- Sort Key: xc_groupby_tab2.val2
- -> Seq Scan on public.xc_groupby_tab2
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab2.val2
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
(32 rows)
-- aggregates over aggregates
(3 rows)
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
- QUERY PLAN
-------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------
Group
Output: val2
Group Key: xc_groupby_tab1.val2
-> Remote Subquery Scan on all
Output: val2
- -> Sort
+ Sort Key: xc_groupby_tab1.val2
+ -> Group
Output: val2
- Sort Key: xc_groupby_tab1.val2
- -> Seq Scan on public.xc_groupby_tab1
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
Output: val2
-(10 rows)
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2
+(14 rows)
select val + val2 from xc_groupby_tab1 group by val + val2;
?column?
(6 rows)
explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
- QUERY PLAN
-------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------
Group
Output: ((val + val2))
- Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
-> Remote Subquery Scan on all
Output: (val + val2)
- -> Sort
+ Sort Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Group
Output: ((val + val2))
- Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
- -> Seq Scan on public.xc_groupby_tab1
- Output: (val + val2)
-(10 rows)
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Sort
+ Output: ((val + val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (val + val2)
+(14 rows)
select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
?column? | val | val2
(4 rows)
explain (verbose true, costs false, nodes false) select b from xc_groupby_def group by b;
- QUERY PLAN
------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------
Group
Output: b
Group Key: xc_groupby_def.b
-> Remote Subquery Scan on all
Output: b
- -> Sort
+ Sort Key: xc_groupby_def.b
+ -> Group
Output: b
- Sort Key: xc_groupby_def.b
- -> Seq Scan on public.xc_groupby_def
+ Group Key: xc_groupby_def.b
+ -> Sort
Output: b
-(10 rows)
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+(14 rows)
select b,count(b) from xc_groupby_def group by b;
b | count
(1 row)
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
- QUERY PLAN
---------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------
GroupAggregate
- Output: pg_catalog.count(*), b
+ Output: count(*), b
Group Key: xc_groupby_def.b
-> Remote Subquery Scan on all
- Output: count(*), b
- -> GroupAggregate
- Output: count(*), b
- Group Key: xc_groupby_def.b
- -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
Output: b
- Sort Key: xc_groupby_def.b
- -> Seq Scan on public.xc_groupby_def
- Output: b
- Filter: (xc_groupby_def.b IS NULL)
-(14 rows)
+ Filter: (xc_groupby_def.b IS NULL)
+(12 rows)
create table xc_groupby_g(a int, b float, c numeric);
insert into xc_groupby_g values(1,2.1,3.2);
create table xc_groupby_tab2 (val int, val2 int);
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
count | sum | avg | ?column? | val2
-------+-----+--------------------+------------------+------
+ 2 | 8 | 4.0000000000000000 | 4 | 2
3 | 6 | 2.0000000000000000 | 2 | 1
3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
- 2 | 8 | 4.0000000000000000 | 4 | 2
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------
+ Sort
+ Output: (count(*)), (sum(val)), (avg(val)), (((sum(val))::double precision / (count(*))::double precision)), val2
+ Sort Key: (count(*)), (sum(xc_groupby_tab1.val))
+ -> Finalize HashAggregate
+ Output: count(*), sum(val), avg(val), ((sum(val))::double precision / (count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ -> Partial HashAggregate
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(13 rows)
+
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
(4 rows)
explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GroupAggregate
- Output: pg_catalog.count(*), pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))), pg_catalog.avg((avg((xc_groupby_tab1.val * xc_groupby_tab2.val)))), ((pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))))::double precision / (pg_catalog.count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), ((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))::double precision / (count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
-> Remote Subquery Scan on all
- Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> GroupAggregate
- Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
- Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Merge Full Join
Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
- Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
- -> Merge Full Join
- Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
- Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Distribute results by H: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Materialize
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
-> Remote Subquery Scan on all
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
Distribute results by H: val2
+ Sort Key: xc_groupby_tab2.val2
-> Sort
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
- Sort Key: xc_groupby_tab1.val2
- -> Seq Scan on public.xc_groupby_tab1
- Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
- -> Materialize
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- -> Remote Subquery Scan on all
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- Distribute results by H: val2
- -> Sort
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
- Sort Key: xc_groupby_tab2.val2
- -> Seq Scan on public.xc_groupby_tab2
- Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab2.val2
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val, xc_groupby_tab2.val2
(32 rows)
-- aggregates over aggregates
-select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x order by 1;
sum
-----
- 17
8
+ 17
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x order by 1;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------
+ Sort
+ Output: (sum((sum(xc_groupby_tab1.val)))), ((xc_groupby_tab1.val2 % 2))
+ Sort Key: (sum((sum(xc_groupby_tab1.val))))
+ -> HashAggregate
+ Output: sum((sum(xc_groupby_tab1.val))), ((xc_groupby_tab1.val2 % 2))
+ Group Key: (xc_groupby_tab1.val2 % 2)
+ -> Finalize HashAggregate
+ Output: sum(xc_groupby_tab1.val), (xc_groupby_tab1.val2 % 2), xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab1.val2, PARTIAL sum(xc_groupby_tab1.val)
+ -> Partial HashAggregate
+ Output: xc_groupby_tab1.val2, PARTIAL sum(xc_groupby_tab1.val)
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+(16 rows)
+
explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
QUERY PLAN
--------------------------------------------------------------------------------------------
-> Remote Subquery Scan on all
Output: xc_groupby_tab1.val2, PARTIAL sum(xc_groupby_tab1.val)
-> Partial HashAggregate
- Output: xc_groupby_tab1.val2, PARTIAL sum(xc_groupby_tab1.val)
+ Output: xc_groupby_tab1.val2, PARTIAL sum(xc_groupby_tab1.val)
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+(13 rows)
+
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2 order by 1;
+ val2
+------
+ 1
+ 2
+ 3
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by 1;
+ QUERY PLAN
+------------------------------------------------------------
+ Finalize GroupAggregate
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Partial HashAggregate
+ Output: val2
Group Key: xc_groupby_tab1.val2
-> Seq Scan on public.xc_groupby_tab1
- Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
-(13 rows)
-
--- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
- val2
-------
- 1
- 3
- 2
-(3 rows)
+ Output: val, val2
+(14 rows)
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
Output: val, val2
(10 rows)
-select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
?column?
----------
- 8
- 4
- 3
- 9
2
+ 3
+ 4
7
+ 8
+ 9
(6 rows)
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
+ QUERY PLAN
+-----------------------------------------------------------------------------
+ Finalize GroupAggregate
+ Output: ((val + val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: (val + val2)
+ Sort Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Sort
+ Output: ((val + val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Partial HashAggregate
+ Output: ((val + val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (val + val2)
+(14 rows)
+
explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
QUERY PLAN
-----------------------------------------------------------------------
Output: (val + val2)
(10 rows)
-select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
?column? | val | val2
----------+-----+------
- 8 | 6 | 2
- 4 | 2 | 2
- 4 | 1 | 3
- 9 | 6 | 3
- 3 | 2 | 1
2 | 1 | 1
+ 3 | 2 | 1
+ 4 | 1 | 3
+ 4 | 2 | 2
4 | 3 | 1
7 | 4 | 3
+ 8 | 6 | 2
+ 9 | 6 | 3
(8 rows)
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: (val + val2), val, val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Sort
+ Output: ((val + val2)), val, val2
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2)), xc_groupby_tab1.val
+ -> HashAggregate
+ Output: (val + val2), val, val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(11 rows)
+
explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
QUERY PLAN
---------------------------------------------------------------------------------------------------
Output: val, val2
(8 rows)
-select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by val, val2;
?column? | val | val2
----------+-----+------
- 6 | 2 | 4
2 | 1 | 1
- 6 | 4 | 2
- 7 | 3 | 4
+ 6 | 2 | 4
5 | 3 | 2
+ 7 | 3 | 4
5 | 4 | 1
+ 6 | 4 | 2
(6 rows)
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by val, val2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Group
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Merge Join
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(22 rows)
+
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
(19 rows)
-select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
?column?
----------
- 5
- 7
2
+ 5
6
+ 7
(4 rows)
-explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
QUERY PLAN
-----------------------------------------------------------------------------------
- HashAggregate
+ Group
Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
-> Remote Subquery Scan on all
Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
- -> HashAggregate
+ Sort Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Sort
Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
-> Merge Join
Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
Sort Key: xc_groupby_tab2.val
-> Seq Scan on public.xc_groupby_tab2
Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
-(21 rows)
+(22 rows)
+
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------
+ HashAggregate
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Merge Join
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(18 rows)
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by val2;
?column? | val2
---------------------+------
11.0000000000000000 | 1
- 17.6666666666666667 | 3
14.0000000000000000 | 2
+ 17.6666666666666667 | 3
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by val2;
+ QUERY PLAN
+----------------------------------------------------------------------------------------
+ Finalize GroupAggregate
+ Output: (((count(*) + sum(val)))::numeric + avg(val)), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Sort Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2, (PARTIAL count(*)), (PARTIAL sum(val)), (PARTIAL avg(val))
+ Sort Key: xc_groupby_tab1.val2
+ -> Partial HashAggregate
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(14 rows)
+
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
----------------------------------------------------------------------------------
(10 rows)
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 2 * val2;
sum | avg | ?column?
-----+--------------------+----------
+ 6 | 2.0000000000000000 | 2
8 | 4.0000000000000000 | 4
11 | 3.6666666666666667 | 6
- 6 | 2.0000000000000000 | 2
(3 rows)
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 2 * val2;
+ QUERY PLAN
+------------------------------------------------------------------------------
+ Finalize GroupAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: (2 * val2), PARTIAL sum(val), PARTIAL avg(val)
+ Sort Key: (2 * xc_groupby_tab1.val2)
+ -> Sort
+ Output: ((2 * val2)), (PARTIAL sum(val)), (PARTIAL avg(val))
+ Sort Key: ((2 * xc_groupby_tab1.val2))
+ -> Partial HashAggregate
+ Output: ((2 * val2)), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(14 rows)
+
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
QUERY PLAN
------------------------------------------------------------------------
Output: a, b
(11 rows)
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
avg
------------------------
-
- 8.0000000000000000
1.00000000000000000000
- 5.0000000000000000
- 9.0000000000000000
- 6.0000000000000000
2.0000000000000000
- 4.0000000000000000
3.0000000000000000
- 10.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
+ 6.0000000000000000
7.0000000000000000
-(11 rows)
-
-select avg(a) from xc_groupby_def group by a;
- avg
-------------------------
-
8.0000000000000000
- 1.00000000000000000000
- 5.0000000000000000
9.0000000000000000
- 6.0000000000000000
- 2.0000000000000000
- 4.0000000000000000
- 3.0000000000000000
10.0000000000000000
- 7.0000000000000000
+
(11 rows)
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
Output: a, b
(8 rows)
-select avg(a) from xc_groupby_def group by b;
+select avg(a) from xc_groupby_def group by b order by 1;
avg
--------------------
4.0000000000000000
(4 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------------
+ Sort
+ Output: (avg(a)), b
+ Sort Key: (avg(xc_groupby_def.a))
+ -> Finalize HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL avg(a)
+ -> Partial HashAggregate
+ Output: b, PARTIAL avg(a)
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(13 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------------
Output: a, b
(10 rows)
-select sum(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b order by 1;
sum
-----
8
(4 rows)
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------------
+ Sort
+ Output: (sum(a)), b
+ Sort Key: (sum(xc_groupby_def.a))
+ -> Finalize HashAggregate
+ Output: sum(a), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL sum(a)
+ -> Partial HashAggregate
+ Output: b, PARTIAL sum(a)
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(13 rows)
+
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------------
Output: a, b
(10 rows)
-select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b order by 1;
count
-------
+ 1
3
4
5
- 1
(4 rows)
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+-----------------------------------------------------------
+ Sort
+ Output: (count(*)), b
+ Sort Key: (count(*))
+ -> Finalize HashAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL count(*)
+ -> Partial HashAggregate
+ Output: b, PARTIAL count(*)
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(13 rows)
+
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
QUERY PLAN
-----------------------------------------------------
Output: a, b
(10 rows)
-select count(*) from xc_groupby_def where a is not null group by a;
+select count(*) from xc_groupby_def where a is not null group by a order by 1;
count
-------
1
1
1
1
- 2
1
1
1
1
+ 2
(10 rows)
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
QUERY PLAN
--------------------------------------------------------
- HashAggregate
- Output: pg_catalog.count(*), b
+ GroupAggregate
+ Output: count(*), b
Group Key: xc_groupby_def.b
-> Remote Subquery Scan on all
- Output: count(*), b
- -> HashAggregate
- Output: count(*), b
- Group Key: xc_groupby_def.b
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
-> Seq Scan on public.xc_groupby_def
- Output: a, b
+ Output: b
Filter: (xc_groupby_def.b IS NULL)
-(11 rows)
+(12 rows)
create table xc_groupby_g(a int, b float, c numeric);
insert into xc_groupby_g values(1,2.1,3.2);
Output: a, b, c
(8 rows)
-select sum(b) from xc_groupby_g group by b;
+select sum(b) from xc_groupby_g group by b order by 1;
sum
-----
- 4.2
2.3
+ 4.2
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (sum(b)), b
+ Sort Key: (sum(xc_groupby_g.b))
+ -> Finalize HashAggregate
+ Output: sum(b), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL sum(b)
+ -> Partial HashAggregate
+ Output: b, PARTIAL sum(b)
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------------
Output: a, b, c
(10 rows)
-select sum(c) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b order by 1;
sum
-----
- 6.4
5.2
+ 6.4
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (sum(c)), b
+ Sort Key: (sum(xc_groupby_g.c))
+ -> Finalize HashAggregate
+ Output: sum(c), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL sum(c)
+ -> Partial HashAggregate
+ Output: b, PARTIAL sum(c)
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------------
Output: a, b, c
(10 rows)
-select avg(a) from xc_groupby_g group by b;
+select avg(a) from xc_groupby_g group by b order by 1;
avg
------------------------
1.00000000000000000000
2.0000000000000000
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (avg(a)), b
+ Sort Key: (avg(xc_groupby_g.a))
+ -> Finalize HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: b, PARTIAL avg(a)
+ -> Partial HashAggregate
+ Output: b, PARTIAL avg(a)
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
QUERY PLAN
---------------------------------------------------
Output: a, b, c
(10 rows)
-select avg(b) from xc_groupby_g group by c;
+select avg(b) from xc_groupby_g group by c order by 1;
avg
-----
- 2.3
2.1
+ 2.3
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (avg(b)), c
+ Sort Key: (avg(xc_groupby_g.b))
+ -> Finalize HashAggregate
+ Output: avg(b), c
+ Group Key: xc_groupby_g.c
+ -> Remote Subquery Scan on all
+ Output: c, PARTIAL avg(b)
+ -> Partial HashAggregate
+ Output: c, PARTIAL avg(b)
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
QUERY PLAN
---------------------------------------------------
Output: a, b, c
(10 rows)
-select avg(c) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c order by 1;
avg
--------------------
- 5.2000000000000000
3.2000000000000000
+ 5.2000000000000000
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c order by 1;
+ QUERY PLAN
+---------------------------------------------------------
+ Sort
+ Output: (avg(c)), c
+ Sort Key: (avg(xc_groupby_g.c))
+ -> Finalize HashAggregate
+ Output: avg(c), c
+ Group Key: xc_groupby_g.c
+ -> Remote Subquery Scan on all
+ Output: c, PARTIAL avg(c)
+ -> Partial HashAggregate
+ Output: c, PARTIAL avg(c)
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(13 rows)
+
explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
QUERY PLAN
---------------------------------------------------
create table xc_groupby_tab2 (val int, val2 int) distribute by replication;
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
count | sum | avg | ?column? | val2
-------+-----+--------------------+------------------+------
+ 2 | 8 | 4.0000000000000000 | 4 | 2
3 | 6 | 2.0000000000000000 | 2 | 1
3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
- 2 | 8 | 4.0000000000000000 | 4 | 2
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), sum(xc_groupby_tab1.val), avg(xc_groupby_tab1.val), ((sum(xc_groupby_tab1.val))::double precision / (count(*))::double precision), xc_groupby_tab1.val2
+ Remote query: SELECT count(*) AS count, sum(val) AS sum, avg(val) AS avg, ((sum(val))::double precision / (count(*))::double precision), val2 FROM xc_groupby_tab1 GROUP BY val2 ORDER BY (count(*)), (sum(val))
+ -> Sort
+ Output: (count(*)), (sum(val)), (avg(val)), (((sum(val))::double precision / (count(*))::double precision)), val2
+ Sort Key: (count(*)), (sum(xc_groupby_tab1.val))
+ -> HashAggregate
+ Output: count(*), sum(val), avg(val), ((sum(val))::double precision / (count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(11 rows)
+
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(15 rows)
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by 1;
val2
------
1
- 3
2
+ 3
(3 rows)
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by 1;
+ QUERY PLAN
+------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: xc_groupby_tab1.val2
+ Remote query: SELECT val2 FROM xc_groupby_tab1 GROUP BY val2 ORDER BY val2
+ -> Sort
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> HashAggregate
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(11 rows)
+
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
----------------------------------------------------------------
(6 rows)
explain (verbose true, costs false, nodes false) select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2) q order by q.val, q.val2;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------
Remote Subquery Scan on all
Output: "?column?", val, val2
- -> Sort
- Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2)), xc_groupby_tab1.val, xc_groupby_tab2.val2
- Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
- -> HashAggregate
- Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
- Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Group
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
-> Merge Join
Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
-----------------------------------------------------------------------------------
Remote Subquery Scan on all
Output: sum
- -> Sort
+ -> Group
Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- -> HashAggregate
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ -> Sort
Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
- Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
-> Merge Join
Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
(21 rows)
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
?column? | val2
---------------------+------
11.0000000000000000 | 1
- 17.6666666666666667 | 3
14.0000000000000000 | 2
+ 17.6666666666666667 | 3
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (((count(*) + sum(xc_groupby_tab1.val)))::numeric + avg(xc_groupby_tab1.val)), xc_groupby_tab1.val2
+ Remote query: SELECT (((count(*) + sum(val)))::numeric + avg(val)), val2 FROM xc_groupby_tab1 GROUP BY val2 ORDER BY (((count(*) + sum(val)))::numeric + avg(val))
+ -> Sort
+ Output: ((((count(*) + sum(val)))::numeric + avg(val))), val2
+ Sort Key: ((((count(*) + sum(xc_groupby_tab1.val)))::numeric + avg(xc_groupby_tab1.val)))
+ -> HashAggregate
+ Output: (((count(*) + sum(val)))::numeric + avg(val)), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(11 rows)
+
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
(8 rows)
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 1, 2;
sum | avg | ?column?
-----+--------------------+----------
+ 6 | 2.0000000000000000 | 2
8 | 4.0000000000000000 | 4
11 | 3.6666666666666667 | 6
- 6 | 2.0000000000000000 | 2
(3 rows)
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 1, 2;
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_tab1.val), avg(xc_groupby_tab1.val), (2 * xc_groupby_tab1.val2)
+ Remote query: SELECT sum(val) AS sum, avg(val) AS avg, (2 * val2) FROM xc_groupby_tab1 GROUP BY (2 * val2) ORDER BY (sum(val)), (avg(val))
+ -> Sort
+ Output: (sum(val)), (avg(val)), ((2 * val2))
+ Sort Key: (sum(xc_groupby_tab1.val)), (avg(xc_groupby_tab1.val))
+ -> HashAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(11 rows)
+
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Output: a, b
(11 rows)
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by a;
avg
------------------------
-
- 8.0000000000000000
- 4.0000000000000000
1.00000000000000000000
- 5.0000000000000000
+ 2.0000000000000000
3.0000000000000000
- 10.0000000000000000
- 9.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
6.0000000000000000
- 2.0000000000000000
7.0000000000000000
+ 8.0000000000000000
+ 9.0000000000000000
+ 10.0000000000000000
+
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by a;
+ QUERY PLAN
+--------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.a
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY a ORDER BY a
+ -> Sort
+ Output: (avg(a)), a
+ Sort Key: xc_groupby_def.a
+ -> HashAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
(11 rows)
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
Output: a, b
(8 rows)
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
avg
------------------------
-
- 8.0000000000000000
- 4.0000000000000000
1.00000000000000000000
- 5.0000000000000000
+ 2.0000000000000000
3.0000000000000000
- 10.0000000000000000
- 9.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
6.0000000000000000
- 2.0000000000000000
7.0000000000000000
+ 8.0000000000000000
+ 9.0000000000000000
+ 10.0000000000000000
+
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
+ QUERY PLAN
+---------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.a
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY a ORDER BY (avg(a))
+ -> Sort
+ Output: (avg(a)), a
+ Sort Key: (avg(xc_groupby_def.a))
+ -> HashAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
(11 rows)
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
Output: a, b
(8 rows)
-select avg(a) from xc_groupby_def group by b;
+select avg(a) from xc_groupby_def group by b order by 1;
avg
--------------------
4.0000000000000000
(4 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.b
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY b ORDER BY (avg(a))
+ -> Sort
+ Output: (avg(a)), b
+ Sort Key: (avg(xc_groupby_def.a))
+ -> HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(11 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
QUERY PLAN
---------------------------------------------------------------------
Output: a, b
(8 rows)
-select sum(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b order by 1;
sum
-----
8
(4 rows)
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b order by 1;
+ QUERY PLAN
+---------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_def.a), xc_groupby_def.b
+ Remote query: SELECT sum(a) AS sum FROM xc_groupby_def GROUP BY b ORDER BY (sum(a))
+ -> Sort
+ Output: (sum(a)), b
+ Sort Key: (sum(xc_groupby_def.a))
+ -> HashAggregate
+ Output: sum(a), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(11 rows)
+
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
QUERY PLAN
---------------------------------------------------------------------
Output: a, b
(8 rows)
-select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b order by b;
count
-------
- 3
- 4
- 5
1
+ 5
+ 4
+ 3
(4 rows)
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b order by b;
+ QUERY PLAN
+------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), xc_groupby_def.b
+ Remote query: SELECT count(*) AS count FROM xc_groupby_def GROUP BY b ORDER BY b
+ -> Sort
+ Output: (count(*)), b
+ Sort Key: xc_groupby_def.b
+ -> HashAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(11 rows)
+
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
QUERY PLAN
-------------------------------------------------------------------------
Output: a, b
(8 rows)
-select count(*) from xc_groupby_def where a is not null group by a;
+select count(*) from xc_groupby_def where a is not null group by a order by 1;
count
-------
1
1
1
1
- 2
1
+ 2
(10 rows)
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a order by 1;
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), xc_groupby_def.a
+ Remote query: SELECT count(*) AS count FROM xc_groupby_def WHERE (a IS NOT NULL) GROUP BY a ORDER BY (count(*))
+ -> Sort
+ Output: (count(*)), a
+ Sort Key: (count(*))
+ -> HashAggregate
+ Output: count(*), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+ Filter: (xc_groupby_def.a IS NOT NULL)
+(12 rows)
+
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
QUERY PLAN
-----------------------------------------------------------------------------------------------
Remote Fast Query Execution
Output: count(*), xc_groupby_def.b
Remote query: SELECT count(*) AS count FROM xc_groupby_def WHERE (b IS NULL) GROUP BY b
- -> HashAggregate
+ -> GroupAggregate
Output: count(*), b
Group Key: xc_groupby_def.b
- -> Seq Scan on public.xc_groupby_def
- Output: a, b
- Filter: (xc_groupby_def.b IS NULL)
-(9 rows)
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+ Filter: (xc_groupby_def.b IS NULL)
+(12 rows)
create table xc_groupby_g(a int, b float, c numeric) distribute by replication;
insert into xc_groupby_g values(1,2.1,3.2);
Output: a, b, c
(8 rows)
-select sum(b) from xc_groupby_g group by b;
+select sum(b) from xc_groupby_g group by b order by 1;
sum
-----
- 4.2
2.3
+ 4.2
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_g.b), xc_groupby_g.b
+ Remote query: SELECT sum(b) AS sum FROM xc_groupby_g GROUP BY b ORDER BY (sum(b))
+ -> Sort
+ Output: (sum(b)), b
+ Sort Key: (sum(xc_groupby_g.b))
+ -> HashAggregate
+ Output: sum(b), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(11 rows)
+
explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
QUERY PLAN
-------------------------------------------------------------------
Output: a, b, c
(8 rows)
-select sum(c) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b order by 1;
sum
-----
- 6.4
5.2
+ 6.4
(2 rows)
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_g.c), xc_groupby_g.b
+ Remote query: SELECT sum(c) AS sum FROM xc_groupby_g GROUP BY b ORDER BY (sum(c))
+ -> Sort
+ Output: (sum(c)), b
+ Sort Key: (sum(xc_groupby_g.c))
+ -> HashAggregate
+ Output: sum(c), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(11 rows)
+
explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
QUERY PLAN
-------------------------------------------------------------------
Output: a, b, c
(8 rows)
-select avg(a) from xc_groupby_g group by b;
+select avg(a) from xc_groupby_g group by b order by 1;
avg
------------------------
1.00000000000000000000
2.0000000000000000
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b order by 1;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.a), xc_groupby_g.b
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_g GROUP BY b ORDER BY (avg(a))
+ -> Sort
+ Output: (avg(a)), b
+ Sort Key: (avg(xc_groupby_g.a))
+ -> HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(11 rows)
+
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
QUERY PLAN
-------------------------------------------------------------------
Output: a, b, c
(8 rows)
-select avg(b) from xc_groupby_g group by c;
+select avg(b) from xc_groupby_g group by c order by c;
avg
-----
- 2.3
2.1
+ 2.3
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c order by c;
+ QUERY PLAN
+------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.b), xc_groupby_g.c
+ Remote query: SELECT avg(b) AS avg FROM xc_groupby_g GROUP BY c ORDER BY c
+ -> Sort
+ Output: (avg(b)), c
+ Sort Key: xc_groupby_g.c
+ -> HashAggregate
+ Output: avg(b), c
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(11 rows)
+
explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
QUERY PLAN
-------------------------------------------------------------------
Output: a, b, c
(8 rows)
-select avg(c) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c order by c;
avg
--------------------
- 5.2000000000000000
3.2000000000000000
+ 5.2000000000000000
(2 rows)
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c order by c;
+ QUERY PLAN
+------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.c), xc_groupby_g.c
+ Remote query: SELECT avg(c) AS avg FROM xc_groupby_g GROUP BY c ORDER BY c
+ -> Sort
+ Output: (avg(c)), c
+ Sort Key: xc_groupby_g.c
+ -> HashAggregate
+ Output: avg(c), c
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(11 rows)
+
explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
QUERY PLAN
-------------------------------------------------------------------
create table xc_groupby_tab2 (val int, val2 int);
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
count | sum | avg | ?column? | val2
-------+-----+--------------------+------------------+------
- 3 | 6 | 2.0000000000000000 | 2 | 1
2 | 8 | 4.0000000000000000 | 4 | 2
+ 3 | 6 | 2.0000000000000000 | 2 | 1
3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------
+ Sort
+ Output: (count(*)), (sum(val)), (avg(val)), (((sum(val))::double precision / (count(*))::double precision)), val2
+ Sort Key: (count(*)), (sum(xc_groupby_tab1.val))
+ -> Finalize GroupAggregate
+ Output: count(*), sum(val), avg(val), ((sum(val))::double precision / (count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Sort Key: xc_groupby_tab1.val2
+ -> Partial GroupAggregate
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2, val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2, val
+(17 rows)
+
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
(22 rows)
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by 1;
val2
------
1
3
(3 rows)
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by 1;
+ QUERY PLAN
+------------------------------------------------------------
+ Group
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Group
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2
+(14 rows)
+
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
- QUERY PLAN
-------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------
Group
Output: val2
Group Key: xc_groupby_tab1.val2
-> Remote Subquery Scan on all
Output: val2
- -> Sort
+ Sort Key: xc_groupby_tab1.val2
+ -> Group
Output: val2
- Sort Key: xc_groupby_tab1.val2
- -> Seq Scan on public.xc_groupby_tab1
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
Output: val2
-(10 rows)
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2
+(14 rows)
-select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
?column?
----------
2
9
(6 rows)
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
+ QUERY PLAN
+------------------------------------------------------------------------------
+ Group
+ Output: ((val + val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: (val + val2)
+ Sort Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Group
+ Output: ((val + val2))
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Sort
+ Output: ((val + val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (val + val2)
+(14 rows)
+
explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
- QUERY PLAN
-------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------
Group
Output: ((val + val2))
Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
-> Remote Subquery Scan on all
Output: (val + val2)
- -> Sort
+ Sort Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Group
Output: ((val + val2))
- Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
- -> Seq Scan on public.xc_groupby_tab1
- Output: (val + val2)
-(10 rows)
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Sort
+ Output: ((val + val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (val + val2)
+(14 rows)
-select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
?column? | val | val2
----------+-----+------
2 | 1 | 1
- 4 | 1 | 3
3 | 2 | 1
+ 4 | 1 | 3
4 | 2 | 2
- 8 | 6 | 2
- 9 | 6 | 3
4 | 3 | 1
7 | 4 | 3
+ 8 | 6 | 2
+ 9 | 6 | 3
(8 rows)
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: (val + val2), val, val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Sort
+ Output: ((val + val2)), val, val2
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2)), xc_groupby_tab1.val
+ -> Group
+ Output: (val + val2), val, val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Sort
+ Output: val, val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(14 rows)
+
explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
QUERY PLAN
---------------------------------------------------------------------------------------------------
Output: val, val2
(11 rows)
-select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by 1, 2;
?column? | val | val2
----------+-----+------
2 | 1 | 1
6 | 2 | 4
5 | 3 | 2
- 7 | 3 | 4
5 | 4 | 1
6 | 4 | 2
+ 7 | 3 | 4
(6 rows)
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by 1, 2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Sort
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2)), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2)), xc_groupby_tab1.val
+ -> Group
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Merge Join
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(25 rows)
+
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
(22 rows)
-select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
?column?
----------
2
7
(4 rows)
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Group
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Sort Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Sort
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ -> Merge Join
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(22 rows)
+
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
QUERY PLAN
-----------------------------------------------------------------------------------
(22 rows)
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
?column? | val2
---------------------+------
11.0000000000000000 | 1
17.6666666666666667 | 3
(3 rows)
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
+ Sort
+ Output: ((((count(*) + sum(val)))::numeric + avg(val))), val2
+ Sort Key: ((((count(*) + sum(xc_groupby_tab1.val)))::numeric + avg(xc_groupby_tab1.val)))
+ -> Finalize GroupAggregate
+ Output: (((count(*) + sum(val)))::numeric + avg(val)), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Sort Key: xc_groupby_tab1.val2
+ -> Partial GroupAggregate
+ Output: val2, PARTIAL count(*), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2, val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2, val
+(17 rows)
+
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
QUERY PLAN
----------------------------------------------------------------------------------
(14 rows)
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 3;
sum | avg | ?column?
-----+--------------------+----------
6 | 2.0000000000000000 | 2
11 | 3.6666666666666667 | 6
(3 rows)
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 3;
+ QUERY PLAN
+------------------------------------------------------------------------
+ Finalize GroupAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: (2 * val2), PARTIAL sum(val), PARTIAL avg(val)
+ Sort Key: (2 * xc_groupby_tab1.val2)
+ -> Partial GroupAggregate
+ Output: ((2 * val2)), PARTIAL sum(val), PARTIAL avg(val)
+ Group Key: ((2 * xc_groupby_tab1.val2))
+ -> Sort
+ Output: ((2 * val2)), val
+ Sort Key: ((2 * xc_groupby_tab1.val2))
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(14 rows)
+
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
QUERY PLAN
------------------------------------------------------------------------
(4 rows)
explain (verbose true, costs false, nodes false) select b from xc_groupby_def group by b;
- QUERY PLAN
------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------
Group
Output: b
Group Key: xc_groupby_def.b
-> Remote Subquery Scan on all
Output: b
- -> Sort
+ Sort Key: xc_groupby_def.b
+ -> Group
Output: b
- Sort Key: xc_groupby_def.b
- -> Seq Scan on public.xc_groupby_def
+ Group Key: xc_groupby_def.b
+ -> Sort
Output: b
-(10 rows)
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+(14 rows)
select b,count(b) from xc_groupby_def group by b;
b | count
(1 row)
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
- QUERY PLAN
---------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------
GroupAggregate
- Output: pg_catalog.count(*), b
+ Output: count(*), b
Group Key: xc_groupby_def.b
-> Remote Subquery Scan on all
- Output: count(*), b
- -> GroupAggregate
- Output: count(*), b
- Group Key: xc_groupby_def.b
- -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
Output: b
- Sort Key: xc_groupby_def.b
- -> Seq Scan on public.xc_groupby_def
- Output: b
- Filter: (xc_groupby_def.b IS NULL)
-(14 rows)
+ Filter: (xc_groupby_def.b IS NULL)
+(12 rows)
create table xc_groupby_g(a int, b float, c numeric);
insert into xc_groupby_g values(1,2.1,3.2);
create table xc_groupby_tab2 (val int, val2 int);
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
-- joins and group by
select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
-- aggregates over aggregates
-select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x order by 1;
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x order by 1;
explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by val2;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by val2;
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
-select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
-select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2, 3;
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
-select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by 1, 2, 3;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by 1, 2, 3;
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
-select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 1;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 1;
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
drop table xc_groupby_tab1;
drop table xc_groupby_tab2;
select a,count(a) from xc_groupby_def group by a order by a;
explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
-select avg(a) from xc_groupby_def group by a;
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
-select avg(a) from xc_groupby_def group by b;
+select avg(a) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
-select sum(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
-select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
-select count(*) from xc_groupby_def where a is not null group by a;
+select count(*) from xc_groupby_def where a is not null group by a order by 1;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a order by 1;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
select * from (select b from xc_groupby_def group by b) q order by q.b;
select sum(a) from xc_groupby_g group by a;
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
-select sum(b) from xc_groupby_g group by b;
+select sum(b) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
-select sum(c) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
-select avg(a) from xc_groupby_g group by b;
+select avg(a) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
-select avg(b) from xc_groupby_g group by c;
+select avg(b) from xc_groupby_g group by c order by 1;
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c order by 1;
explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
-select avg(c) from xc_groupby_g group by c;
-explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c order by 1;
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c order by 1;
drop table xc_groupby_def;
drop table xc_groupby_g;
create table xc_groupby_tab2 (val int, val2 int) distribute by replication;
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2, 3;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2, 3;
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
-- joins and group by
select * from (select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2 c1, xc_groupby_tab2.val2 c2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2) q order by q.c1, q.c2;
select * from (select sum(y) sum from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x) q order by q.sum;
explain (verbose true, costs false, nodes false) select * from (select sum(y) sum from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x) q order by q.sum;
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by 1;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by 1;
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
select * from (select val + val2 sum from xc_groupby_tab1 group by val + val2) q order by q.sum;
explain (verbose true, costs false, nodes false) select * from (select val + val2 sum from xc_groupby_tab1 group by val + val2) q order by q.sum;
select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2 sum from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2) q order by q.sum;
explain (verbose true, costs false, nodes false) select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2 sum from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2) q order by q.sum;
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by val2;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by val2;
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 2 * val2;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 2 * val2;
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
drop table xc_groupby_tab1;
drop table xc_groupby_tab2;
select a,count(a) from xc_groupby_def group by a order by a;
explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
-select avg(a) from xc_groupby_def group by a;
-explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
-select avg(a) from xc_groupby_def group by b;
+select avg(a) from xc_groupby_def group by a order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
-select sum(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
-select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
-select count(*) from xc_groupby_def where a is not null group by a;
+select count(*) from xc_groupby_def where a is not null group by a order by 1;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a order by 1;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
select * from (select b from xc_groupby_def group by b) q order by q.b;
select sum(a) from xc_groupby_g group by a;
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
-select sum(b) from xc_groupby_g group by b;
+select sum(b) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
-select sum(c) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
-select avg(a) from xc_groupby_g group by b;
+select avg(a) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
-select avg(b) from xc_groupby_g group by c;
+select avg(b) from xc_groupby_g group by c order by 1;
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c order by 1;
explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
-select avg(c) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c order by 1;
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c order by 1;
explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
drop table xc_groupby_def;
create table xc_groupby_tab2 (val int, val2 int);
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
-- joins and group by
select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
-- aggregates over aggregates
-select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x order by 1;
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x order by 1;
explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by 1;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by 1;
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
-select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
-select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
-select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by val, val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by val, val2;
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
-select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by val2;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by val2;
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 2 * val2;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 2 * val2;
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
drop table xc_groupby_tab1;
drop table xc_groupby_tab2;
select a,count(a) from xc_groupby_def group by a order by a;
explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
-select avg(a) from xc_groupby_def group by a;
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
-select avg(a) from xc_groupby_def group by b;
+select avg(a) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
-select sum(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
-select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
-select count(*) from xc_groupby_def where a is not null group by a;
+select count(*) from xc_groupby_def where a is not null group by a order by 1;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a order by 1;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
select * from (select b from xc_groupby_def group by b) q order by q.b;
select sum(a) from xc_groupby_g group by a;
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
-select sum(b) from xc_groupby_g group by b;
+select sum(b) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
-select sum(c) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
-select avg(a) from xc_groupby_g group by b;
+select avg(a) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
-select avg(b) from xc_groupby_g group by c;
+select avg(b) from xc_groupby_g group by c order by 1;
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c order by 1;
explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
-select avg(c) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c order by 1;
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c order by 1;
explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
drop table xc_groupby_def;
create table xc_groupby_tab2 (val int, val2 int) distribute by replication;
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
-- joins and group by
select * from (select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2 c1, xc_groupby_tab2.val2 c2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2) q order by q.c1, q.c2;
select * from (select sum(y) sum from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x) q order by q.sum;
explain (verbose true, costs false, nodes false) select * from (select sum(y) sum from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x) q order by q.sum;
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by 1;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by 1;
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
select * from (select val + val2 sum from xc_groupby_tab1 group by val + val2) q order by q.sum;
explain (verbose true, costs false, nodes false) select * from (select val + val2 sum from xc_groupby_tab1 group by val + val2) q order by q.sum;
select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2 sum from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2) q order by q.sum;
explain (verbose true, costs false, nodes false) select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2 sum from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2) q order by q.sum;
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 1, 2;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
drop table xc_groupby_tab1;
drop table xc_groupby_tab2;
select a,count(a) from xc_groupby_def group by a order by a;
explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by a;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by a;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
-select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
-select avg(a) from xc_groupby_def group by b;
+select avg(a) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
-select sum(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
-select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b order by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b order by b;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
-select count(*) from xc_groupby_def where a is not null group by a;
+select count(*) from xc_groupby_def where a is not null group by a order by 1;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a order by 1;
explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
select * from (select b from xc_groupby_def group by b) q order by q.b;
select sum(a) from xc_groupby_g group by a;
explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
-select sum(b) from xc_groupby_g group by b;
+select sum(b) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
-select sum(c) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
-select avg(a) from xc_groupby_g group by b;
+select avg(a) from xc_groupby_g group by b order by 1;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b order by 1;
explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
-select avg(b) from xc_groupby_g group by c;
+select avg(b) from xc_groupby_g group by c order by c;
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c order by c;
explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
-select avg(c) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c order by c;
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c order by c;
explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
drop table xc_groupby_def;
create table xc_groupby_tab2 (val int, val2 int);
insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
-select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
-- joins and group by
select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
-- group by without aggregate
-select val2 from xc_groupby_tab1 group by val2;
+select val2 from xc_groupby_tab1 group by val2 order by 1;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2 order by 1;
explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
-select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2 order by 1;
explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
-select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
-select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by 1, 2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2 order by 1, 2;
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
-select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2 order by 1;
explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
-- group by with aggregates in expression
-select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2 order by 1;
explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
-- group by with expressions in group by clause
-select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 3;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2 order by 3;
explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
drop table xc_groupby_tab1;
drop table xc_groupby_tab2;