POSTGRES ´Â ¿ÞÂÊ, ¿À¸¥ÂÊ ´ÜÀÏ ¿¬»êÀÚ¿Í ¹ÙÀ̳ʸ® ¿¬»êÀÚ¸¦ Á¦°øÇÑ´Ù. ¿¬»êÀÚ´Â ¼·Î ´Ù¸¥ ¼ýÀÚ³ª ÇüÀÇ ¸Å°³ÀÎÀÚ¿¡ °úÁß ÀûÀçµÇ°Å³ª Àç»ç¿ëµÉ ¼ö ÀÖ´Ù. ¿¬»êÀÚ°¡ ¾Ö¸ÅÇÑ À§Ä¡¿¡ ÀÖ´Ù¸é ½Ã½ºÅÛÀº ¿Ã¹Ù¸¥ ¿¬»êÀÚ¸¦ °áÁ¤ÇÒ ¼ö ¾øÀ¸ ¸ç, ¿¡·¯¸¦ ¹ÝȯÇÑ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡, ¾î´À ¿¬»êÀÚ¸¦ »ç¿ëÇÒ °ÍÀÎÁö ÀÌÇØ¸¦ µ½ ±â À§ÇØ ¿ÞÂÊ/¿À¸¥ÂÊ ÇÇ¿¬»êÀÚ¸¦ Çüº¯È¯ ÇÒ ¼ö ÀÖ´Ù.
µÎ°³ÀÇ complex ¸â¹ö¸¦ ´õÇÏ´Â ¿¬»êÀÚ¸¦ ¸¸µå·Á¸é ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù. ¸ÕÀú »õ·Î¿î Çü¿¡ ÇÊ¿äÇÑ ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ±×¸®°í ³ª¼, ÇØ´ç ¿¬»êÀÚ¸¦ À̵é ÇÔ ¼ö¿Í ÇÔ²² ¸¸µé¸é µÈ´Ù.
CREATE FUNCTION complex_add(complex, complex) RETURNS complex AS '$PWD/obj/complex.so' LANGUAGE 'c';
CREATE OPERATOR + ( leftarg = complex, rightarg = complex, procedure = complex_add, commutator = + );
sfunc2 ¸¸ Á¤ÀÇÇÑ´Ù¸é, °¢°¢ÀÇ ÀνºÅϽº¿¡¼ ¼Ó¼º°ª°ú´Â µ¶¸³ÀûÀ¸·Î ¼öÇàµÇ´Â ÇÔ¼ö ·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. "Count" ´Â ÀÌ·¯ÇÑ aggregate Á¾·ùÀÇ ´ëÇ¥ÀûÀÎ °æ¿ìÀÌ´Ù. "Count" ´Â 0¿¡¼ ½ÃÀ۵ǰí, °¢°¢ÀÇ ÀνºÅϽº¸¶´Ù ÇÕ°è¿¡ 1ÀÌ ´õÇØÁö¸ç ÀνºÅϽºÀÇ °ªÀº ¹«½ÃµÈ´Ù. ¿©±â¼´Â POSTGRES ³»Àå ·çÆ¾ÀÎ int4inc ¸¦ »ç¿ëÇÑ´Ù. ÀÌ ·çƾÀº ÇØ´ç ÀÎÀÚÀÇ °ªÀ» Çϳª Áõ°¡½ÃŲ´Ù.
CREATE AGGREGATE my_count (sfunc2 = int4inc, -- add one
basetype = int4, stype2 = int4,
initcond2 = '0'
);
SELECT my_count(*) as emp_count from EMP;
emp_count
---------
4
"Average" ´Â ÇÕ°è¿Í Ƚ¼ö, µÑ´Ù °è»êÇÏ´Â ÇÔ¼ö¸¦ ÇÊ¿ä·Î ÇÏ´Â aggregate ÀÇ ¿¹ÀÌ ´Ù. ¸ðµç ÀνºÅϽº°¡ ó¸®µÇ°í ³ª¸é, aggregate ¿¡¼ ¸¶Áö¸· ÀÀ´äÀ¸·Î Çհ踦 Ƚ ¼ö·Î ³ª´«´Ù. ÀÌÀü¿¡ »ç¿ëÇß´ø int4pl °ú int4inc ¿Í ¸¶Âù°¡Áö·Î int4div ´Â POSTGRES ÀÇ Á¤¼ö ³ª´°¼À ·çƾÀ̸ç, Çհ踦 Ƚ¼ö·Î ³ª´« °á°ú¸¦ °è»êÇÑ´Ù.
CREATE AGGREGATE my_average (sfunc1 = int4pl, -- sum
basetype = int4,
stype1 = int4,
sfunc2 = int4inc, -- count
stype2 = int4,
finalfunc = int4div, -- division
initcond1 = '0',
initcond1 = '0'
);
SELECT my_average(salary) as emp_average FROM EMP;
emp_average
------------
1640