Агрегаты в PostgreSQL

Напишите агрегат, чтобы подсчитать, сколько раз число 40 видно в столбце.

Используйте свой агрегат, чтобы подсчитать количество 40-летних в таблице каталогов.

Это то, что я делал:

Create function aggstep(curr int) returns int as $$
begin
    return curr.count where age = 40;
end;
$$ language plpgsql;

Create aggregate aggs(integer) (
stype = int,
initcond = '',
sfunc = aggstep);

Select cas(age) from directory;

1 ответ

Вы можете сделать это, например, так:

Сначала создайте функцию перехода:

CREATE FUNCTION count40func(bigint, integer) RETURNS bigint
   LANGUAGE sql IMMUTABLE CALLED ON NULL INPUT AS
'SELECT $1 + ($2 IS NOT DISTINCT FROM 40)::integer::bigint';

Это работает, потому что FALSE::integer 0 и TRUE::integer это 1.

я использую IS NOT DISTINCT FROM скорее, чем = так что он делает правильную вещь для NULL.

Агрегат может быть определен как

CREATE AGGREGATE count40(integer) (
   SFUNC = count40func,
   STYPE = bigint,
   INITCOND = 0
);

Вы можете запросить как

SELECT count40(age) FROM directory;
Другие вопросы по тегам