From PgsqlWiki
ÐèÇó
ÓиöºÜ³£¼ûµÄÐèÇ󣺱ÈÈ磬Óиö±í£¬ÀïÃæÓÐÖ÷¼ü£¬È»ºóÓм¸¸ö×ֶΣ¬È»ºóÒªÇóÎÒÃǸù¾Ýij¸ö×ֶεÄÿ¸ö²»Í¬µÄÖµ£¬È¡³ö±íÖеÄÈô¸ÉÐгöÀ´¡£
ÕâÖÖÐèÇóÔÚ²ÉÑùºÍ·ÖÀàÊä³öÀàµÄÓ¦ÓÃÖзdz£³£¼û¡£
·ÖÎö
¼ÈÈ»ÊÇ·ÖÀàÊä³ö£¬ÄÇôÎÒÃǿ϶¨Ïëµ½ÁË group by£¬ÏÖÔÚÎÊÌâÀ´ÁË£¬group by Ö®ºó£¬ÔÚSELECTµÄÊä³öÁбíÀֻÄܳöÏÖ·Ç group by ×ֶεľۼ¯£¬¶ø²»ÄܳöÏÖÕâЩ×ֶεľßÌåÖµ£¬PostgreSQL ÕâÑù×öÊÇ·ûºÏ¼¯ºÏÊýѧµÄ¶¨ÒåµÄ£¬µ«ÊÇÈ´ÈÃÎÒÃÇÓÃÆðÀ´ÓÐЩ²»Ë¬¡£¾ÝÎÒËùÖª MySQL ºÜ¶àʱºò¾ÍÊÇÖ±½Ó×öÁËÕâÑùµÄÊä³ö£¬µ«ÊǶàÉÙÊÇÎ¥·´±ê×¼ºÍÊýѧÀíÂÛ¡£
ÄÇôPostgreSQLÀïÍ·½â¾ö·½·¨ÊÇÊ²Ã´ÄØ£¿
ÕâÀï»ù±¾µÄ½â¾ö·½·¨ÊÇ£¬´´½¨×Ô¼ºµÄÓû§¶¨ÖƵľۼ¯º¯Êý£¬ÓÉÕâ¸ö¾Û¼¯º¯ÊýÉú³ÉÒ»¸öÖ÷¼üµÄ¼¯ºÏ£¬È»ºóͨ¹ýÕâ¸öÖ÷¼ü¼¯ºÏ£¬ÓÃ×Ó²éѯ¼ìË÷³öËùÓÐÐèÒªµÄÊý¾ÝÐС£
ÕâÀïÎÒÃÇÐèҪעÒâµÄÊÇ£º¾Û¼¯º¯Êý±ØÐë·µ»Ø±êÁ¿½á¹û£¬ËùÒÔÎÒÃÇÐèÒª°ÑÖ÷¼ü¼¯ºÏ·ÅÔÚÒ»¸ö±êÁ¿ÀÕâÀï±È½ÏͨÓõÄ×ö·¨ÊÇÀûÓÃÊý×éÀ´´æ´¢Õâ¸ö¼¯ºÏ¡£È»ºóÀûÓÃPostgreSQLµÄ²»Í¬µÄÊý×éµÄ¹ý³Ì£¬À´ÊµÏÖ½üºõ 0 ±àÂëµÄͨÓö¨ÖÆ¡£
¾ÙÀý
¾ÙÀý£¬ÎÒÓÐÒ»¸ö¹ñÔ±±í£¬±í½á¹¹ÈçÏ£¬Õâ¸ö±í¿ÉÒÔͨ¹ý pgbench -i »ñµÃ£º
laser=# \d tellers ×ÊÁϱí "public.tellers" À¸Î» | Ðͱð | ÐÞÊÎ´Ê ----------+---------------+---------- tid | integer | not null bid | integer | tbalance | integer | filler | character(84) |
ÕâÀïµÄ bid ±íʾÁ¬ËøµêÆÌµÄID£¬tid±íʾ¹ñÔ±µÄID£¬ÎÒÏÖÔÚÐèÒª´Óÿ¸öÁ¬ËøµêÖÐÕÒ³öËæ±ã 5 ¸ö¹ñÔ±À´£¬Õâ¸öÊÂÇéÓ¦¸ÃÔõô×ö£¿
ÎÒ²»Ì«Çå³þmysqlÔõô×ö£¨Ò²ÐíºÜ¼òµ¥£©£¬²»¹ýÔÚPGÀïÉÔ΢ÐèÒªÓÃһЩģ¿é£¬Õâ¸öÄ£¿é¾ÍÊÇ intarray Ä£¿é£¬ÎÒµÄ×ö·¨ÊÇ£º
- ´´½¨Ò»¸ö¾Û¼¯º¯Êý£º
CREATE AGGREGATE int_array_accum ( BASETYPE=_int4, SFUNC=intarray_push_array, stype=_int4);
Õâ¸ö¾Û¼¯º¯ÊýµÄÄ¿µÄºÜ¼òµ¥£¬¾ÍÊǰÑÁ½¸öÕûÊýÊý×鯴½ÓÆðÀ´£¬·µ»ØÖ®¡£¾ßÌåµÄÎĵµ£¬¿ÉÒԲο¼£º
http://www.pgsqldb.org/pgsqldoc-8.1c/xaggr.html http://www.pgsqldb.org/pgsqldoc-8.1c/sql-createaggregate.html
ºÍ intarray µÄÎĵµ£º
http://www.pgsqldb.org/mwiki/index.php/Intarray
ÒÔ¼° intagg Ä£¿éµÄÎĵµ£º
http://www.pgsqldb.org/mwiki/index.php/Intagg
ÆäÖÐÓõ½µÄÆ´½Óº¯Êý intarray_push_array ÆäʵÊÇ intarray µÄÁ½¸öÊý×éÏà¼Ó£¨+ºÅ£©µÄ´¦Àíº¯Êý¡£¿ÉÒÔÔÚintarrayµÄ³õʼ»¯SQLÎļþ _int.sql ÀïÃæÕÒµ½£¨ÔÚ4EµÄRPM°üÀïÊÇ/usr/local/pgsql/share/contrib/_int.sql£©£¬
- Ö´ÐÐÏÂÃæµÄ²éѯ£º
select * from tellers where ( select int_array_accum(a.array) from (select subarray(int_array_aggregate(tid),0,5) as array from tellers group by bid) a) @@ tid::text::query_int;
¾Í»áµÃµ½ÆÚÍûµÄÊä³ö¡£Õâ¸ö²éѯÓеãÒâ˼£¬ÎÒÃǷֽ⿴¿´£º
×îÄÚ²ãµÄ£º
select subarray(int_array_aggregate(tid),0,5) as array from tellers group by bid;
ÎÒÃÇÆäʵÊǶÔÿ¸ö bid £¨Á¬ËøµêID£©£¬È»ºóµ÷Óà int_array_aggregate ¾Û¼¯º¯Êý£¨¼ûintagg£©µÄÎĵµ£¬°Ñÿ¸ö bid Êä³öµÄ tid ×éºÏ³ÉÒ»¸öÕûÊýÊý×飬int_array_aggregateÊÇintaggÄ£¿éÌṩµÄÒ»¸ö¾Û¼¯º¯Êý£¬ÒòΪgroup byÖ®ºó£¬ÔÚSELECTµÄÊä³öÁбíÀïÖ»ÄܳöÏÖgroup byµÄidºÍ¾Û¼¯º¯Êý£¬ËùÒÔÕâÀï±ØÐë¾Û¼¯Ò»Ï¡£Ö®ºóÓà intarrayµÄsubarrayÈ¡Êä³öµÄÍ·5¸öÔªËØ¡£
È»ºó£¬½«ÉÏÃæÕâ¸ö²éѯµÄÊä³ö£¬ÔÙ´ÎÓþۼ¯º¯ÊýÆ´³ÉÒ»¸ö¸ü´óµÄÊý×飺
select int_array_accum(a.array) from (select subarray(int_array_aggregate(tid),0,5) as array from tellers group by bid) a;
ÒòΪ¾Û¼¯º¯Êý²»ÄÜǶÌ×£¬ËùÒÔÎÒÃÇÓÃÒ»¸ö×Ó²éÑ¯ÆÆËü¡£È»ºó¾ÍµÃµ½Ò»¸öN³¤µÄÕûÊýÊý×飬ÀïÍ·µÄËùÓÐ ID¾ÍÊÇÎÒÃÇÐèҪȡ³öÀ´µÄID£¬ÓÚÊÇ£¬×îºó£º
select * from tellers where ( select int_array_accum(a.array) from (select subarray(int_array_aggregate(tid),0,5) as array from tellers group by bid) a) @@ tid::text::query_int;
°ÑËùÓÐÔÚÕâ¸öÊý×éÀïÍ·µÄIDÐеĶÔÓ¦Êý¾Ý¶¼ÕÒ³öÀ´£¬ÎÒÃÇÕâÀïÓÃÁËintarray µÄ @@²Ù×÷·ûºÍquery_intÀàÐÍ£¬²»¹ýÕâ¸öÆäʵҲ¿ÉÒÔÓÃANYºÍINµÈ¹¹Ô죬ÀíÂÛÉϲ»¸´ÔÓ£¬´ó¼Ò¶¼¿ÉÒÔÊÔÊÔ¡£


