Tim*_*lim 9 sql postgresql aggregate-functions postgresql-9.1 hstore
我有这样一张桌子:
Table "public.statistics"
id | integer | not null default nextval('statistics_id_seq'::regclass)
goals | hstore |
Run Code Online (Sandbox Code Playgroud)
项目:
|id |goals |
|30059 |"3"=>"123" |
|27333 |"3"=>"200", "5"=>"10" |
Run Code Online (Sandbox Code Playgroud)
我需要做什么来通过哈希键来聚合所有值?
我想得到这样的结果:
select sum(goals) from statistics
Run Code Online (Sandbox Code Playgroud)
返回
|goals |
|"3"=>"323", "5"=>"10" |
Run Code Online (Sandbox Code Playgroud)
Cra*_*ger 15
在Laurence的答案的基础上,这是一种纯粹的SQL方法,可以将总和的键/值对聚合到一个新的hstore使用array_agg和hstore(text[], text[])构造函数中.
http://sqlfiddle.com/#!1/9f1fb/17
SELECT hstore(array_agg(hs_key), array_agg(hs_value::text))
FROM (
SELECT
s.hs_key, sum(s.hs_value::integer)
FROM (
SELECT (each(goals)).* FROM statistics
) as s(hs_key, hs_value)
GROUP BY hs_key
) x(hs_key,hs_value)
Run Code Online (Sandbox Code Playgroud)
我也to_number用简单的强制转换替换为整数并简化了键/值迭代.
可能有一些方法可以避免数字转换,但这应该可以完成工作:
SELECT
key, Sum(to_number(value, '999999999999')) FROM (
SELECT (each(goals)).key, (each(goals)).value FROM public.statistics
) as s
Group By
key
Run Code Online (Sandbox Code Playgroud)
http://sqlfiddle.com/#!1/eb745/10/0
这是Postgres不想弯曲的大气味,但:
create table test (id int, goals hstore);
Insert Into Test(id, goals) Values (30059, '3=>123');
Insert Into Test(id, goals) Values (27333, '3=>200,5=>10');
Create Function hagg() returns hstore As
'Declare ret hstore := ('''' :: hstore); i hstore; c cursor for Select hstore(key, (x.Value::varchar)) From (Select key, Sum((s.value::int)) as Value From (Select (each(goals)).* From Test) as s Group By key) as x; BEGIN Open c; Loop Fetch c into i; Exit When Not FOUND; ret := i || ret; END LOOP; return ret; END' Language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我无法让sql小提琴接受多行函数体,在实际的postgres中,您应该能够引用$并将其分解。
http://sqlfiddle.com/#!1/e2ea7/1/0