Re: [SQL] Re: [HACKERS] Re: SELECT DISTINCT ON ... ORDER BY ...

jose' soares <sferac@bo.nettuno.it>

From: "jose' soares" <sferac@bo.nettuno.it>
To: Oliver Elphick <olly@lfix.co.uk>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, pgsql-sql@hub.org, pgsql-hackers@postgreSQL.org
Date: 1999-02-01T14:57:52Z
Lists: pgsql-hackers

Oliver Elphick ha scritto:

> Tom Lane wrote:
>   >Thomas Metz <tmetz@gsf.de> writes:
>   >> SELECT DISTINCT ON id id, name FROM test ORDER BY name;
>   >> [doesn't work as expected]
>   >
>   >There have been related discussions before on pg-hackers mail list;
>   >you might care to check the list archives.  The conclusion I recall
>   >is that it's not real clear how the combination of SELECT DISTINCT
>   >on one column and ORDER BY on another *should* work.  Postgres'
>   >current behavior is clearly wrong IMHO, but there isn't a unique
>   >definition of right behavior, because it's not clear which tuples
>   >should get selected for the sort.
>   >
>   >This "SELECT DISTINCT ON attribute" option strikes me as even more
>   >bogus.  Where did we get that from --- is it in the SQL92 standard?
>
> I looked through the standard yesterday and couldn't find it.  It doesn't
> seem to be a useful extension, since it does nothing that you can't do
> with GROUP BY and seems much less well defined.  For the moment I have
> added a brief description to the reference documentation for SELECT.
>
>   >If you SELECT DISTINCT on a subset of the attributes to be returned,
>   >then there's no unique definition of which values get returned in the
>   >other columns.  In Thomas' example:
>  ...
>   >Any of these are "DISTINCT ON id", but it's purely a matter of
>   >happenstance table order and unspecified implementation choices which
>   >one will appear.  Do we really have (or want) a statement with
>   >inherently undefined behavior?
>
> We have it; I suggest we don't want it!

Yes, seems that SELECT DISTINCT ON is not part of SQL92 but it is very
interesting and I think it is something missing to Standard.
I don't know how to do the following, if we take off DISTINCT ON from
PostgreSQL:

db=> select distinct cognome, nome,via from membri where cap = '41010';
cognome|nome            |via
-------+----------------+--------------------------
FIORANI|ELISABETTA      |VIA PRETI PARTIGIANI, 63
FIORANI|GASTONE         |VIA PRETI PARTIGIANI, 63
FIORANI|MATTIA          |VIA PRETI PARTIGIANI, 63
FIORANI|SIMONE          |VIA PRETI PARTIGIANI, 63
GOZZI  |LILIANA         |VIA MAGNAGHI, 39
GOZZI  |MATTEO          |VIA MAGNAGHI, 39
RUSSO  |DAVIDE          |STRADA CORLETTO SUD, 194/1
RUSSO  |ELENA TERESA    |STRADA CORLETTO SUD, 194/1
RUSSO  |FORTUNATO       |STRADA CORLETTO SUD, 194/1
RUSSO  |MAURIZIO ANTONIO|STRADA CORLETTO SUD, 194/1
(10 rows)

db=> select distinct on cognome cognome, nome,via from membri where cap =
'41010';
cognome|nome            |via
-------+----------------+--------------------------
FIORANI|GASTONE         |VIA PRETI PARTIGIANI, 63
GOZZI  |LILIANA         |VIA MAGNAGHI, 39
RUSSO  |MAURIZIO ANTONIO|STRADA CORLETTO SUD, 194/1
(3 rows)