31.10. �û�����ۼ�

�� PostgreSQL��ľۼ�����״ֵ̬ �� ״̬ת���������ġ� Ҳ����˵��һ���ۼ����Զ���ΪһЩ״̬�� ��һ���������Ŀ������ʱ����Щ״̬���޸ġ� Ҫ����һ���µľۼ����������Ǿ�Ҫѡ��һ����ʾ״ֵ̬���������ͣ� һ��״̬��ʼֵ��һ��״̬ת�������� ��״̬ת������ֻ��һ����ͨ������Ҳ�������ھۼ��Ļ���֮�⡣ ����������һ���մ������� ���ڶԸ��������ľۼ��������Ҫ���������е�״ֵ̬��������ݲ�ͬ�������

��ˣ����˱��ۼ��û������IJ����ͽ�����������⣬����һ���ڲ�״ֵ̬�������ͣ��������Ϳ��ܺͲ����������Ͷ���һ����

������Ƕ�����һ����ʹ���մ������ľۼ��� �����ǵľۼ����Ƕ�ÿ����¼���ֶ�ֵ���к������㡣 sum����ͣ�������ۼ������ӡ� sum���㿪ʼ��ÿ�ζ��������ܺ�׷�ӵ�ǰ��¼ֵ�����磬�������Ҫ�� Sum �ۼ����ڸ���������ֻ��Ҫ���������͵ļӷ����������ˡ� �þۼ������������壺

CREATE AGGREGATE complex_sum (
    sfunc = complex_add,
    basetype = complex,
    stype = complex,
    initcond = '(0,0)'
);

SELECT complex_sum(a) FROM test_complex;

 complex_sum
-------------
 (34,53.9)

��ʵ���ϣ����ǻ������ۼ�����Ϊ sum��Ȼ���� PostgreSQL �����ֶ�һ������Ϊ complex ����Ӧ��ʹ������ sum����

��������ڷǿ�����ֵ�������sum���彫������ֵ����ʼ״̬�������� ������������������»�ϣ������NULL — SQL��׼Ҫ�� sum ����Ϊ�������ġ� ����ֻ��Ҫ����initcond�ξͿ���ʵ����һ�㣬 ������ʼ״̬������ NULL�� ͨ����Ҳ��ζ��sfunc��Ҫ��� NULL ״̬�������룬 �������� sum ��һЩ��Max��Min�����ļ򵥾ۼ���˵�� �ѵ�һ���ǿ�������뵽״ֵ̬���棬 Ȼ��ӵڶ����ǿ�����״ֵ̬��ʼʹ��ת���������㹻�ˡ� �����ʼ������NULL����ת���������Ϊ"strict"�� ��Ҳ����˵�����ܶ�NULL������á��� PostgreSQL �ͻ��Զ�������Щ���ݡ�

����һ��"strict"ת��������ȱʡ�����ǣ�������һ��NULL�����ʱ�� ǰ��һ��״̬ת�������ᱻ�������������Ķ��� �������ͺ�����NULL�������ϣ���Կ�ֵ��������������ֻ��Ҫ ������ת����������Ϊ�ϸ��Ȼ���д�����ʱ�� ����NULL������Ӧ�����ɡ�

avg��ƽ�����Ǹ�����һ��ľۼ������ӡ�����Ҫ��������ʱ״̬�� ������ܺ��Լ����������ļ��������ս����ͨ������Щ������õ��ġ� ƽ���ĵ���ʵ��������Ԫ��������״ֵ̬�����磬�ڽ��� avg(float8)ʵ���������ģ�

CREATE AGGREGATE avg (
    sfunc = float8_accum,
    basetype = float8,
    stype = float8[],
    finalfunc = float8_avg,
    initcond = '{0,0}'
);

�ۼ���������ʹ�ö�̬ת�����������մ������� ������ͬһ��������������ʵ�ֶ���ۼ��� ���� Section 31.2.5 ��ȡ��̬�����Ľ��͡� �ٽ�һ�����ۼ�������������ö�̬�Ļ������ͺ�״̬������������ ����������һ���ۼ��������ڶ��������������͡� ������һ����̬�ۼ������ӣ�

CREATE AGGREGATE array_accum (
    sfunc = array_append,
    basetype = anyelement,
    stype = anyarray,
    initcond = '{}'
);

�������ۼ����õ�ʵ��״̬�����Ǻ�Ԫ������������ͬ���������͡�

������ʹ��������ͬʵ������������ΪԪ�ص������

SELECT attrelid::regclass, array_accum(attname)
    FROM pg_attribute
    WHERE attnum > 0 AND attrelid = 'pg_user'::regclass
    GROUP BY attrelid;

 attrelid |                                 array_accum
----------+-----------------------------------------------------------------------------
 pg_user  | {usename,usesysid,usecreatedb,usesuper,usecatupd,passwd,valuntil,useconfig}
(1 row)

SELECT attrelid::regclass, array_accum(atttypid)
    FROM pg_attribute
    WHERE attnum > 0 AND attrelid = 'pg_user'::regclass
    GROUP BY attrelid;

 attrelid |         array_accum
----------+------------------------------
 pg_user  | {19,23,16,16,16,25,702,1009}
(1 row)

����ϸ����Ϣ��ο� CREATE AGGREGATE ���