【问题标题】:Column containing the product of elements in a second column, sorted by group包含第二列中元素乘积的列,按组排序
【发布时间】:2021-09-06 23:09:20
【问题描述】:

我有以下 SQL 脚本,

Select To_Char(A1.Date1, 'dd-mm-yyyy') As  Date, B1.bm, A1.Number
From A1 
Inner Join Benchmarkdefs B1 On (A1.Bmik = B1.Bmik);

, 产生,

Date        BM  Number
11-08-2021  AA  1
12-08-2021  AA  2
13-08-2021  AA  3
14-08-2021  AA  4
15-08-2021  AA  5
11-08-2021  BB  12
12-08-2021  BB  13
13-08-2021  BB  14
14-08-2021  BB  15
15-08-2021  BB  16
11-08-2021  CC  22
12-08-2021  CC  23
13-08-2021  CC  24
14-08-2021  CC  25
15-08-2021  CC  26

我希望创建一个列Product,其中包含同一BM 组内每个日期Numbers 的乘积:

Date        BM  Number  Product sum             
11-08-2021  AA  1       120             
12-08-2021  AA  2       120             
13-08-2021  AA  3       120             
14-08-2021  AA  4       120             
15-08-2021  AA  5       120             
11-08-2021  BB  12      524160              
12-08-2021  BB  13      524160              
13-08-2021  BB  14      524160              
14-08-2021  BB  15      524160              
15-08-2021  BB  16      524160              
11-08-2021  CC  22      524160              
12-08-2021  CC  23      7893600             
13-08-2021  CC  24      7893600             
14-08-2021  CC  25      7893600             
15-08-2021  CC  26      7893600

澄清一下,对于 BM ='AA',产品应该是 1*2*3*4*5=120

提前感谢您! 最好的问候,

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    没有内置的产品功能;但您可以使用the exp/ln technique from this question,并将其调整为使用解析和:

    select to_char(a1.date1, 'dd-mm-yyyy') as date1, b1.bm, a1.number1,
      round(cast(exp(sum(ln(cast(a1.number1 as binary_double))) over (partition by b1.bmik)) as number)) as product
    from a1 
    inner join benchmarkdefs b1 on (a1.bmik = b1.bmik);
    
    DATE1 BM NUMBER1 PRODUCT
    12-08-2021 AA 2 120
    11-08-2021 AA 1 120
    13-08-2021 AA 3 120
    14-08-2021 AA 4 120
    15-08-2021 AA 5 120
    12-08-2021 BB 13 524160
    11-08-2021 BB 12 524160
    13-08-2021 BB 14 524160
    15-08-2021 BB 16 524160
    14-08-2021 BB 15 524160
    11-08-2021 CC 22 7893600
    12-08-2021 CC 23 7893600
    14-08-2021 CC 25 7893600
    13-08-2021 CC 24 7893600
    15-08-2021 CC 26 7893600

    db<>fiddle 显示了一些中间步骤。

    您示例中的列名是非法的,所以我假设您只是更改了那些用于发布;所以我稍微修改了它们以使其有效。

    请注意,如果您的数字可以为零,那么您可能需要排除它以防止出错;如果你有负值,你也需要以不同的方式处理它们;您可能还想根据您的真实数据调整round() 精度。

    【讨论】:

    • 谢谢你,@Alex。我知道我没有在我的问题中指定这一点,但如果我要从产品中减去数字 1,我应该在哪里或如何在 round(cast(exp(sum(ln(cast(a1.number1 as binary_double))) over (partition by b1.bmik)) as number)) as product 中包含“-1”
    • @CecilieS.K - exp() 之外的任何地方;但为简单起见,还不如在as 之前结束 - 所以round(...) -1 as product
    猜你喜欢
    • 2012-03-08
    • 2017-06-17
    • 2021-04-21
    • 2012-03-13
    • 2017-03-02
    • 2022-01-04
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多