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-02T15:25:19Z
Lists: pgsql-hackers

Oliver Elphick ha scritto:

> "jose' soares" wrote:
>   >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)
>
> This gives the same results:
>
> junk=> select cognome, nome, via from membri where cap = '41010' group by cognome;
> cognome|nome      |via
> -------+----------+--------------------------
> FIORANI|ELISABETTA|VIA PRETI PARTIGIANI, 63
> GOZZI  |LILIANA   |VIA MAGNAGHI, 39
> RUSSO  |DAVIDE    |STRADA CORLETTO SUD, 194/1

This is very interesting and useful, I thought it wasn't possible. Seems that standard allows
only the "order by" column(s)
and the aggregate function(s) on target list.
I tried the same query on Informix, also on Ocelot but it gives me an error.

On Informix and Ocelot
queries like:
   select  cognome, max(age) from membri where cap = '41010' group by cognome;
are allowed.
but
queries like:
   select cognome, nome, via from membri where cap = '41010' group by cognome;
aren't allowed.

-Jose'-