簡體   English   中英

從Postgres中的數組列聚合的不同值的數組

[英]array of distinct values aggregated from an array column in Postgres

假設我們(在PostgreSQL 9.1中)有一個帶有一些標識符的表,一個類型為integer []的列和一些其他列(至少有一個,盡管可能有更多)的整數類型(或任何其他可以求和的列)。

目標是為“summable”列的每個標識符和數組列的所有不同元素的數組提供聚合。

我能找到的唯一方法是在子查詢中的數組列上使用不需要的函數,然后將其與聚合“可累計”列的另一個子查詢連接。

一個簡單的例子如下:

CREATE TEMP TABLE a (id integer, aint integer[], summable_val integer);
INSERT INTO a VALUES
(1, array[1,2,3], 5),
(2, array[2,3,4], 6),
(3, array[3,4,5], 2),
(1, array[7,8,9], 19);

WITH u AS (
SELECT id, unnest(aint) as t FROM a GROUP BY 1,2
),
d AS (
SELECT id, array_agg(distinct t) ar FROM u GROUP BY 1),
v as (
SELECT id, sum(summable_val) AS val
FROM a GROUP BY 1
)
SELECT v.id, v.val, d.ar
FROM v
JOIN d
ON   v.id = d.id;

上面的代碼完成了我的意圖,但問題是我們可以做得更好嗎? 這個解決方案的主要缺點是它讀取和聚合表兩次,這對於較大的表可能是麻煩的。

對一般問題的一些其他解決方案是避免使用數組列並為每個數組成員聚合“summable”列,然后在聚合中使用array_agg - 但至少現在我想堅持這種數組方式。

提前感謝任何想法。

查詢可能會快一點(我猜)但我看不到任何顯着的優化:

select a.id, sum(summable_val) val, ar
from
    (select id, array_agg(distinct t) ar 
        from 
        (select id, unnest(aint) as t from a group by 1,2) u
    group by 1) x
    join a on x.id = a.id
group by 1,3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM