Re: Extract only maximum date from column - Mailing list pgsql-general

From David G. Johnston
Subject Re: Extract only maximum date from column
Date
Msg-id CAKFQuwbzjjBi7YV1gSn=2jX7h-FK8kf8fbpWmpYqX-8pSD7beA@mail.gmail.com
Whole thread Raw
In response to Re: Extract only maximum date from column  (Rich Shepard <rshepard@appl-ecosys.com>)
Responses Re: Extract only maximum date from column
List pgsql-general
On Thursday, December 4, 2025, Rich Shepard <rshepard@appl-ecosys.com> wrote:
On Thu, 4 Dec 2025, David G. Johnston wrote:

I would go with a lateral join subquery of the contracts table. Using an
aggregates to perform ranking is an anti-pattern. You want the contract
ranked first when ordered by contract_date. Either use a window function
to explicitly rank the contracts or use a limit/fetch clause to simply
return the first ordered one.

David,

I'm closer, but still missing the proper syntax:

select p.person_nbr, p.company_nbr, c.next_contact
from people as p, contacts as c
join lateral (select max(c.next_contact) as last_contact
     where p.person_nbr = c.person_nbr and
     last_contact >= '2025-11-01'
     )
     c on true;

resulting in:
psql:companies-contacted-2025.sql:9: ERROR:  aggregate functions are not allowed in FROM clause of their own query level
LINE 3: join lateral (select max(c.next_contact) as last_contact

As mentioned, the aggregate max should be avoided - you aren’t doing statistics, you are ranking.

Select person.*, lastcontact.* from person join lateral (select contact.* from contact where contact.person_id=person.person_id  order by last_contact_date desc limit 1) as lastcontact on true;

David J.

pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: Extract only maximum date from column
Next
From: Rich Shepard
Date:
Subject: Re: Extract only maximum date from column