【问题标题】:cumulative sum using postgresql使用 postgresql 的累积和
【发布时间】:2018-03-04 09:51:30
【问题描述】:

我有以下疑问:

  select configurationfromintarray(1,string_to_array('4441,4945',',')::int[]) as config, 
        p.partname,rtrim(sum(distinct a.ref || ','),',') as refs,
        p.partid as partid,
        from productiongeneratebom(string_to_array('4441,4945',',')::int[],2405) a 
        join .....
        group by configurationfromintarray(1,string_to_array('4441,4945',',')::int[]),
        p.partname,p.partid

结果如下:

config  partname  refs           partid
SBC1    test1   C250,C252        7102
SBC1    test2   C344,C419,C421   1034  
SBC2    test45  C111             3986

查询在函数中运行,并且信息参数会相应更改。 基本上这意味着对于配置SBC1,我需要将部分test1 放在参考文献C250,C252 中。我不知道需要放置的数量。所以我需要添加一个显示该信息的列。

FROM 集群还有一个名为 quantity 的列。

如果我这样做

select ref,partid,quantity
from productiongeneratebom(string_to_array('4441,4945',',')::int[],2405) a
where partid=7102 order by ref

我会得到:

ref partid quanity
C250  7102   1
C252  7102  3

我想修改我的查询,使其也有一列包含所需的总数量。 所以在上面的例子中它将是:

config  partname  refs           partid    QUANTITY
SBC1    test1   C250,C252        7102         4     // 3 from C250, 1 from C252
SBC1    test2   C344,C419,C421   1034         ?
SBC2    test45  C111             3986         ?

我尝试使用: sum(a.quantity) OVER (PARTITION BY rtrim(sum(distinct a.ref || ','),',')) AS quantity 但它不起作用。它说:

错误:列“a.quantity”必须出现在 GROUP BY 子句中,否则 在聚合函数中使用

我该如何解决?这种求和应该很难实现。

编辑: 如果我从

中删除不同的单词
p.partname,rtrim(sum(distinct a.ref || ','),',') as refs,

我会得到:

config  partname  refs           partid    
SBC1    test1   C250,C252,C252,C252,C252,C250,C250,C250       7102 

distinct 确保我只会看到每个 ref 一次。但是我不能使用 distinct 关键字来求和,所以如果我简单地添加: sum (a.quantity) 我会得到不正确的结果。

config  partname  refs                                        partid quantity
SBC1    test1   C250,C252,C252,C252,C252,C250,C250,C250       7102     16 

我只需要对每个 ref 的数量求和一次!

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我会从一个简单的sum(quantity)开始:

    select configurationfromintarray(1,string_to_array('4441,4945',',')::int[]) as config, 
            p.partname, rtrim(sum(distinct a.ref || ','),',') as refs,
            p.partid as partid,
            sum(quantity)
    from productiongeneratebom(string_to_array('4441,4945',',')::int[],2405) a join .....
    group by config, p.partname, p.partid;
    

    如果你想合并多行的值,你可以使用窗口函数。

    【讨论】:

    • 我试过了。它行不通。这就是为什么在我创建 ref 字符串时会有一个不同的原因。连接乘以行......我需要一种方法来对每个分组的每个参考数量求和一次。
    • @avi 。 . .您似乎需要两个级别的聚合,一个在 ref 级别,然后一个将它们组合在一起。
    • 但是我该怎么做呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2014-05-15
    • 2014-05-02
    • 2017-09-16
    • 2018-06-05
    • 2018-02-01
    相关资源
    最近更新 更多