比较行与数组元素postgres

时间:2018-01-14 18:53:53

标签: sql arrays postgresql lateral-join

我有A行(200+)和不同数字列的表n 我有一个B行({1}}行(100K +)和一个名为m的列,其类型为array(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,但我无法获得有效的结果。
任何提示?谢谢!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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