Re: group by points

Started by Albe Laurenzalmost 20 years ago4 messageshackers
Jump to latest
#1Albe Laurenz
all@adv.magwien.gv.at

Jaime Casanova wrote:

suppose we have something like this:

upd_views=# create table tabla1 (col1 point);

[...]

then, this select will give an error:

upd_views=# select col1, count(*) from tabla1 group by col1;
ERROR: could not identify an ordering operator for type point
HINT: Use an explicit ordering operator or modify the query.
upd_views=#

i guess this is related to:
http://archives.postgresql.org/pgsql-hackers/2003-08/msg00809.php

so, what happened with this idea? there is another way to automagicaly
identify an "equality operator" for datatypes like 'point'?

I don't think that there is a connection to the message you quote.

In order to (efficiently) process a GROUP BY clause, you need a
total ordering on the data type that you group by, i.e. an ordering
such that for any two data x and y you have either x < y or x > x
or x = y.

There is no reasonable total ordering on the real plain, so you will
have to roll your own. How about:

select point(col1[0], col1[1]), count(*) from tabla1 group by col1[0],
col1[1];

Yours,
Laurenz Albe

#2Bruno Wolff III
bruno@wolff.to
In reply to: Albe Laurenz (#1)

On Mon, May 22, 2006 at 10:23:28 +0200,
Albe Laurenz <all@adv.magwien.gv.at> wrote:

In order to (efficiently) process a GROUP BY clause, you need a
total ordering on the data type that you group by, i.e. an ordering
such that for any two data x and y you have either x < y or x > x
or x = y.

An equality operator is good enough if the number of unique groups isn't too
large, so that a hash aggregate plan works efficiently.

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruno Wolff III (#2)

Bruno Wolff III <bruno@wolff.to> writes:

On Mon, May 22, 2006 at 10:23:28 +0200,
Albe Laurenz <all@adv.magwien.gv.at> wrote:

In order to (efficiently) process a GROUP BY clause, you need a
total ordering on the data type that you group by, i.e. an ordering
such that for any two data x and y you have either x < y or x > x
or x = y.

An equality operator is good enough if the number of unique groups isn't too
large, so that a hash aggregate plan works efficiently.

Doesn't help for the case at hand, since point_eq isn't marked hashable
either. It would be good to fix things so that the system doesn't
insist on having the sorting option available, though.

regards, tom lane

#4Bruno Wolff III
bruno@wolff.to
In reply to: Tom Lane (#3)

On Mon, May 22, 2006 at 18:38:35 -0400,
Tom Lane <tgl@sss.pgh.pa.us> wrote:

Bruno Wolff III <bruno@wolff.to> writes:

On Mon, May 22, 2006 at 10:23:28 +0200,
Albe Laurenz <all@adv.magwien.gv.at> wrote:

In order to (efficiently) process a GROUP BY clause, you need a
total ordering on the data type that you group by, i.e. an ordering
such that for any two data x and y you have either x < y or x > x
or x = y.

An equality operator is good enough if the number of unique groups isn't too
large, so that a hash aggregate plan works efficiently.

Doesn't help for the case at hand, since point_eq isn't marked hashable
either. It would be good to fix things so that the system doesn't
insist on having the sorting option available, though.

Yeah, I thought about that later on my way home. You need to have a hash
function that maps equal values to the same hash bucket or things don't
work.