Re: Enhancement request: enable FIRST/LAST_value() also as a regularaggregate (not only as windowing function) - Mailing list pgsql-hackers

From matshyeq
Subject Re: Enhancement request: enable FIRST/LAST_value() also as a regularaggregate (not only as windowing function)
Date
Msg-id CAONr5=sa2q87tZwkP9pmeJn5nwtNpY_7ZE1e_BHJxt=_4XX=mQ@mail.gmail.com
Whole thread Raw
In response to Re: Enhancement request: enable FIRST/LAST_value() also as a regularaggregate (not only as windowing function)  (Robert Haas <robertmhaas@gmail.com>)
Responses Re: Enhancement request: enable FIRST/LAST_value() also as a regular aggregate (not only as windowing function)  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Thanks Robert!
I thought this could be nice functionality available out of the box
but yea, sure, that would work for me.
Can I make custom aggregate function that accepts WITHIN GROUP syntax?
Which language would that need to be implemented in? Would you have examples (url?)

Thank you,
Kind Regards 
~Maciek
On Thu, 26 Jul 2018 at 16:22, Robert Haas <robertmhaas@gmail.com> wrote:
On Tue, Jul 24, 2018 at 4:16 PM, matshyeq <matshyeq@gmail.com> wrote:
I'd like to throw here an enhancement proposal to discuss/consider.
The FIRST/LAST_value() functions offer powerful lookup capabilities, eg.
here

SELECT t.* ,FIRST_value(v1)OVER(PARTITION BY gid ORDER BY v2) fv ,LAST_value(v1)OVER(PARTITION BY gid ORDER BY v2 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) lv FROM( VALUES (1, 'b', 3),(1, 'd', 1),(1, 'a', 2) ,(2, 'x', 7),(2, 'y', 9),(2, 'z', 8),(2, 'v', 9)) t (gid, v1, v2);




but, given those values are repeating - why can't I simply use this functions as regular aggregates?

Or can I? It doesn't seem to be possible while I find this use case actually more common than in windowing context…
Am I missing some workaround here?

Why not just define a custom aggregate function that does whatever you need?  I don't think it would be too hard.  e.g. for something like LAST_VALUE() just make the transition type equal to the output type and save the last value you've seen thus far as the transition value.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: 11beta crash/assert caused by parameter type changes
Next
From: Tom Lane
Date:
Subject: Re: Enhancement request: enable FIRST/LAST_value() also as a regular aggregate (not only as windowing function)