postgresql - 合并来自多行的 hstore 数据

标签 postgresql aggregate hstore

假设我有一个定义如下的表:

CREATE TABLE test (
  values HSTORE NOT NULL
);

想象一下,我插入了几条记录,结果如下:

values
-----------------------------
"a"=>"string1","b"=>"string2"
"b"=>"string2","c"=>"string3"

有什么方法可以进行聚合查询,为我提供一个新的 hstore,其中包含所有行的合并键(和值)。

伪查询:

SELECT hstore_sum(values) AS value_sum FROM test;

期望的结果:

value_sum
--------------------------------------------
"a"=>"string1","b"=>"string2","c"=>"string3"

我知道每个键的不同值可能存在冲突,但在我的例子中,选择哪个值的顺序/优先级并不重要(它甚至不必是确定性的,因为它们对于相同的 key )。

这是否可能开箱即用,还是您必须使用一些特定的自制 SQL 函数或其他函数来完成?

最佳答案

你可以做很多事情,f.ex:

我的第一个想法是使用 each()函数,并分别聚合键和值,例如:

SELECT  hstore(array_agg(key), array_agg(value))
FROM    test,
LATERAL each(hs);

但这表现最差。

您可以使用 hstore_to_array()功能也一样,构建一个键值改变数组,如(@JakubKania):

SELECT  hstore(array_agg(altering_pairs))
FROM    test,
LATERAL unnest(hstore_to_array(hs)) altering_pairs;

但这还不完美。

您可以依靠 hstore 值的表示,并构建一个字符串,它将包含您所有的对:

SELECT  hstore(string_agg(nullif(hs::text, ''), ','))
FROM    test;

这是相当快的。但是,如果您愿意,可以使用 custom aggregate function (可以使用内置的 hstore 连接):

CREATE AGGREGATE hstore_sum (hstore) (
    SFUNC = hs_concat(hstore, hstore),
    STYPE = hstore
);

-- i used the internal function (hs_concat) for the concat (||) operator,
-- if you do not want to rely on this function,
-- you could easily write an equivalent in a custom SQL function

SELECT hstore_sum(hs)
FROM   test;

SQLFiddle

关于postgresql - 合并来自多行的 hstore 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25846892/

相关文章:

sql-server - 将选择计数(*)值保存为整数(SQL Server)

带剪枝的笛卡尔积的 LINQ 实现

postgresql - Postgres hstore 是否支持每个元素的原子更新?

ruby-on-rails - Hstore 上的 Rails Postgres 查询以避免 SQL 注入(inject)

postgresql - 错误、系统查询、Postgresql 查询调试的不同日志文件

json - 如何过滤jsonb数组元素

sql - 有没有一种方法可以防止在没有唯一性的情况下插入特定情况?

R相当于Excel的 "Sumif(s)"函数跨like列

postgresql - 如何通过加入的 hstore 键在一个组上计数不同?

java - 将数组参数绑定(bind)到 native 查询