On Thursday, December 4, 2025, Rich Shepard <[email protected]> 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.
