Агрегаты в PostgreSQL - PullRequest
       14

Агрегаты в PostgreSQL

0 голосов
/ 04 декабря 2018

Напишите агрегат, чтобы подсчитать, сколько раз число 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 Ответ

0 голосов
/ 04 декабря 2018

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

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

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;
...