Re: SELECT DISTINCT on boxes - Mailing list pgsql-bugs

From Bruce Momjian
Subject Re: SELECT DISTINCT on boxes
Date
Msg-id 200407150329.i6F3TBg06522@candle.pha.pa.us
Whole thread Raw
In response to SELECT DISTINCT on boxes  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses Re: SELECT DISTINCT on boxes  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
Bruce Momjian wrote:
> Is there a way to do a SELECT DISTINCT on boxes:
>
>         test=> create TABLE t3 (a box);
>         CREATE TABLE
>         test=> insert into t3 values ('(2,2),(1,1)');
>         INSERT 17232 1
>         test=> insert into t3 values ('(2,2),(1,1)');
>         INSERT 17233 1
>         test=> insert into t3 values ('(3,3),(2,2)');
>         INSERT 17234 1
>         test=> insert into t3 values ('(3,3),(2,2)');
>         INSERT 17235 1
>         test=> select distinct * from t3;
>         ERROR:  could not identify an ordering operator for type box
>         HINT:  Use an explicit ordering operator or modify the query.
>
> I tried doing subqueries and using oids but that didn't help.
>
> I don't understand why this doesn't work:
>
>     SELECT a
>     FROM t3 t2
>     WHERE t2.oid = (SELECT MIN(t.oid) FROM t3 t WHERE t2.a = t.a);
>
>           a
>     -------------
>      (2,2),(1,1)
>     (1 row)
>
> If finds only the duplicate.

I found the cause.  Equals for boxes compares only area, \do:

    pg_catalog | =    | box    | box     | boolean   | equal by area

The proper fix is to use ~= which compares boxes for similarity:

    pg_catalog | ~=   | box   | box   | boolean            | same as?

The correct query for DISTINCT is:

    test=> SELECT oid, a FROM t3 t2 WHERE t2.oid = (SELECT MIN(t.oid) FROM
    t3 t WHERE t2.a ~= t.a);
      oid  |      a
    -------+-------------
     17232 | (2,2),(1,1)
     17234 | (3,3),(2,2)
    (2 rows)

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

pgsql-bugs by date:

Previous
From: Bruce Momjian
Date:
Subject: SELECT DISTINCT on boxes
Next
From: Tom Lane
Date:
Subject: Re: SELECT DISTINCT on boxes