Re: GROUP BY column alias?

From: Scott Bailey <artacus(at)comcast(dot)net>
To: "Eric B(dot) Ridge" <ebr(at)tcdi(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: GROUP BY column alias?
Date: 2010-02-18 21:31:38
Message-ID: 4B7DB1BA.6050505@comcast.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Eric B. Ridge wrote:
> Maybe I'm getting too old to SQL anymore, but I ran across something yesterday in a machine generated query that took me over an hour to figure out.
>
> Here's a little testcase. Maybe somebody can explain why the last "Not Expected" case does what it does.
>
> select version();
> PostgreSQL 8.4.1 on i386-apple-darwin10.0.0, compiled by GCC i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646), 64-bit
>
> create table foo(day timestamp);
> insert into foo values (now());
> insert into foo values (now());
>
> Expected:
> select day, count(*) from foo group by day;
> day | count
> ----------------------------+-------
> 2010-02-18 15:41:37.335357 | 1
> 2010-02-18 15:41:39.471746 | 1
> (2 rows)
>
> Expected:
> select day::date, count(*) from foo group by day;
> day | count
> ------------+-------
> 2010-02-18 | 1
> 2010-02-18 | 1
> (2 rows)
>
> Expected:
> select day::date, count(*) from foo group by day::date;
> day | count
> ------------+-------
> 2010-02-18 | 2
> (1 row)
>
> Expected:
> select day::date as bar, count(*) from foo group by bar;
> bar | count
> ------------+-------
> 2010-02-18 | 2
> (1 row)
>
> Not Expected:
> select day::date as day, count(*) from foo group by day;
> day | count
> ------------+-------
> 2010-02-18 | 1
> 2010-02-18 | 1
> (2 rows)
>
> Note in the last case, the "day" column is aliased as "day", but the group by using the physical "day" column, not the alias. That boggles my mind, especially when you consider the case above it, where "day" is aliased as "bar" and grouping by "bar" works as expected.
>
> eric

I'm not sure why you would be surprised by that behavior. You are
grouping by a timestamp, so any microsecond difference will be a new group.

If you want to make that work try:
SELECT day::date, --no need to alias as same name
COUNT(*) FROM foo
GROUP BY day::date;

Scott

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Reid Thompson 2010-02-18 21:43:27 Re: SQL select return into PSQL variables.
Previous Message Eric B. Ridge 2010-02-18 20:52:36 GROUP BY column alias?