Агрегаты в 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;