From: | "Peter J(dot) Holzer" <hjp-pgsql(at)hjp(dot)at> |
---|---|
To: | pgsql-general(at)postgresql(dot)org |
Subject: | Column aliases in GROUP BY and HAVING |
Date: | 2020-10-12 14:10:08 |
Message-ID: | 20201012141008.GA25581@hjp.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
In my mental model of how SQL works, the clauses of an SQL query (if
present) are processed in a certain order:
FROM
WHERE
SELECT
GROUP BY
HAVING
ORDER BY
LIMIT
and each processes the output of the previous one.
However, consider this:
hjp=> select * from employees;
╔════════════╤═══════╤════════════╗
║ ssn │ name │ other_data ║
╟────────────┼───────┼────────────╢
║ 1234010400 │ Alice │ (∅) ║
║ 2345180976 │ Bob │ (∅) ║
║ 2645101276 │ Carol │ (∅) ║
║ 9843100395 │ David │ (∅) ║
╚════════════╧═══════╧════════════╝
hjp=> select substring(ssn, 9, 2) as year, count(*) from employees group by year;
╔══════╤═══════╗
║ year │ count ║
╟──────┼───────╢
║ 95 │ 1 ║
║ 76 │ 2 ║
║ 00 │ 1 ║
╚══════╧═══════╝
(3 rows)
In the GROUP BY clause I can use the alias year which was defined
earlier in SELECT.
HAVING comes after GROUP BY, so I should be able to use that there, too.
Right?
hjp=> select substring(ssn, 9, 2) as year, count(*) from employees group by year having year > '20';
ERROR: column "year" does not exist
LINE 1: ...ear, count(*) from employees group by year having year > '20...
Wrong. I have to use the whole expression again:
hjp=> select substring(ssn, 9, 2) as year, count(*) from employees group by year having substring(ssn, 9, 2) > '20';
╔══════╤═══════╗
║ year │ count ║
╟──────┼───────╢
║ 95 │ 1 ║
║ 76 │ 2 ║
╚══════╧═══════╝
(2 rows)
This seems inconsistent to me. Is there a technical or semantic reason
for this or is just "because the standard says so".
hp
PS: Please no discussions about the appropriateness of using an SSN as
an id. This is a completely made-up example.
--
_ | Peter J. Holzer | Story must make more sense than reality.
|_|_) | |
| | | hjp(at)hjp(dot)at | -- Charles Stross, "Creative writing
__/ | http://www.hjp.at/ | challenge!"
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2020-10-12 14:40:03 | Re: Column aliases in GROUP BY and HAVING |
Previous Message | Chris Sterritt | 2020-10-12 13:35:41 | Re: PostgreSQL processes use large amount of private memory on Windows |