Aggregates to return first or last values/rows
======================================
This extension provides four aggregates:
- first(anyelement)
- first(anyelement, int4)
- last(anyelement)
- last(anyelement, int4)
Which return respectively first or last values in given column. In case
two-argument version is used, it will return up to this value elements,
as array.
It can be loaded by any user, as it only uses SQL language.
Building and install
--------
Obtain sources:
- from github: https://github.com/depesz/first_last
- or from PGXN: http://pgxn.org/dist/first_last/
Run (in top directory):
$ make install
or, if you have pgxn client installed, just:
$ pgxn install first_last
Then, in PostgreSQL you can do:
$ CREATE EXTENSION first_last;
or:
$ CREATE SCHEMA first_last;
$ CREATE EXTENSION first_last WITH SCHEMA first_last;
Afterwards, you can use provided function (optionally prefixing it with
schema name) in your queries.
Example
-------
In example below, I assume you created the extension in public schema,
or you added its schema to search_path.
Get 5 largest tables and indexes with their base size:
select
relkind,
first( relname, 5 order by relpages desc ) as names,
first( relpages, 5 order by relpages desc ) as sizes
from pg_class
where relkind in ('r', 'i')
group by relkind;
-[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------------------------------------
relkind | i
names | {pg_depend_reference_index,pg_depend_depender_index,pg_proc_proname_args_nsp_index,pg_description_o_c_o_index,pg_attribute_relid_attnam_index}
sizes | {44,40,32,21,13}
-[ RECORD 2 ]-------------------------------------------------------------------------------------------------------------------------------------------
relkind | r
names | {pg_proc,pg_depend,pg_attribute,pg_description,pg_statistic}
sizes | {73,54,47,34,16}
Similarly you can use last(). If you want to return just one value, it's
better to use single-argument version of the aggregates, as it will be
slightly faster.
--
Hubert depesz Lubaczewski
depesz@depesz.com