0

我有一个A包含n行(200+)和不同数字列的表。
我有一个表B,其中包含m行 (100K+) 和一个名为 的列multipliers,其类型为数组 ( REAL[])。对于 中的每一行B,该数组的长度为n,即。中的每个数值变量的乘数A。对数组进行排序以匹配中id字段的字母顺序A

桌子A

id | values_1 | values_2
---|----------|-------------
1  | 11.2     | 10.2
2  | 21.9     | 12.5
3  | 30.0     | 26.0
4  | 98.0     | 11.8

桌子B

id      | multipliers
--------|-------------
dafcec  | {2,3,4,9}
nkjhbn  | {0,0,1,5}
ccseff  | {1,2,0,5}
ddeecc  | {0,0,0,1}

我需要一个返回SUM( multipliers * values_1 ).

像这样:

b.id    | sum(b.multipliers*a.value_1)
--------|----------------------------------
dafcec  | 2*11.2 + 3*21.9 + 4*30.0 + 9*98.0
nkjhbn  | 0*11.2 + 0*21.9 + 1*30.0 + 5*98.0
ccseff  | 1*11.2 + 2*21.9 + 0*30.0 + 5*98.0
ddeecc  | 0*11.2 + 0*21.9 + 0*30.0 + 1*98.0

我尝试过使用不同的子查询、LATERAL连接和UNNEST,但我无法获得有效的结果。
有什么提示吗?谢谢!

4

2 回答 2

0

解决了。
它只需要将它们打包values成一个数组并解压缩它们,以便它们具有可比性。它对我有用。ORDER BY确保包装按所需顺序进行。

   SELECT id, SUM (field * multiplier) result FROM 
    (
    with c as (
        SELECT array_agg( values_1 ORDER BY name ASC) val1
        from A
    ) 

    , ag as (
        select
            distinct id,
            multipliers
        from B
        )

    SELECT
        ag.id, 
        unnest(c.val1) field,
        unnest(ag.multipliers) multiplier
    FROM
        c, ag
    ) s
GROUP BY id
于 2018-01-14T23:18:39.753 回答
0

最简单但我相信对数组求和的昂贵方法是:

t=# with b as (select id,unnest(multipliers) u from b)
select distinct id, sum(u)over (partition by id) from b;
    id    | sum
----------+-----
 ccseff   |   8
 nkjhbn   |   6
 ddeecc   |   1
 dafcec   |  18
(4 rows)

我没有想到任何快速的选择......

进一步 - 如果我做对了,你想要一个笛卡尔积 - 完全反对,那么:

t=# with b as (select id,unnest(multipliers) u from b)
, ag as (select distinct id, sum(u)over (partition by id) from b)
select ag.sum * v1, a.id aid, ag.id idb
from ag
join a on true;
 ?column? | aid |   idb
----------+-----+----------
     89.6 |   1 | ccseff
    175.2 |   2 | ccseff
      240 |   3 | ccseff
      784 |   4 | ccseff
     67.2 |   1 | nkjhbn
    131.4 |   2 | nkjhbn
      180 |   3 | nkjhbn
      588 |   4 | nkjhbn
     11.2 |   1 | ddeecc
     21.9 |   2 | ddeecc
       30 |   3 | ddeecc
       98 |   4 | ddeecc
    201.6 |   1 | dafcec
    394.2 |   2 | dafcec
      540 |   3 | dafcec
     1764 |   4 | dafcec
(16 rows)
于 2018-01-14T19:51:30.660 回答