【问题标题】:Update a Column in Table更新表中的列
【发布时间】:2026-01-08 15:30:01
【问题描述】:

我有一个要求,其中有一个如下所示的表格

Invoice Date        Year    Amount
1001    04-NOV-15   2015    100
1001    04-NOV-16   2016    400
1001    04-NOV-17   2017    600
1002    01-OCT-17   2014    1000

我希望最后有一列应该计算时尚差异

Invoice Date        Year    Amount    Calculation
1001    04-NOV-15   2015    100       0
1001    04-NOV-16   2016    400       ((04-NOV-16)-(04-NOV-15))/(400-300)
1001    04-NOV-17   2017    600       ((04-NOV-17)-(04-NOV-16))/(600-400)
1002    01-OCT-14   2014    1000      0
1002    01-OCT-18   2018    2000      ((01-OCT-18)-(01-OCT-14))/(2000-1000)
1003    01-JAN-14   2014    1000      0

计算栏是必填项和

我尝试了下面给出金额差异的查询

select invoice, 
       date_value,
       Year_va,
       amount,
       amount-lag(amount) over (partition by invoice

                                                order by date_value,invoice
                                               ) diff                                      
 from sample;

当尝试了

select invoice, 
       date_value,
       Year_va,
       amount,
       MOD(date_value-lag(date_value),amount-lag(amount)) over (partition by invoice

                                                order by date_value,invoice
                                               ) diff                                      
 from sample;

由于窗口函数错误而失败。

有人可以帮忙吗....

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    如果你想要区别,你为什么要使用mod()

    ( (date_value - lag(date_value) over (partition by invoice order by date_value) ) /
      (amount - lag(amount) over (partition by invoice order by date_value) )
    ) as ratio
    

    您可能希望coalesce() 获得0s 而不是NULLs(您的查询无法处理此问题,但您的示例数据表明您可能想要这样做)。

    【讨论】:

    • 我没有使用过 coalesce()。你能帮我完成整个查询吗?我正在使用 oracle sql 开发人员
    • 你能看看这个问题*.com/questions/47208379/…
    【解决方案2】:

    正如 Gordon 所指出的,您可以使用lag 函数以及如下的coalesce 来获得您想要的结果。

    SELECT t1.*
        ,coalesce((
                date_value - lag(date_value) OVER (
                    PARTITION BY invoice ORDER BY date_value
                    )
                ) / (
                amount - lag(amount) OVER (
                    PARTITION BY invoice ORDER BY date_value
                    )
                ), 0) AS ratio
    FROM table1 t1;
    

    您还可以使用ANSI 等效项,即min/maxROWS BETWEEN 1 PRECEDING AND 1 PRECEDING,如下所示。

    SELECT t1.*
        ,coalesce((
                date_value - min(date_value) OVER (
                    PARTITION BY invoice ORDER BY date_value ROWS BETWEEN 1 PRECEDING
                            AND 1 PRECEDING
                    )
                ) / (
                amount - min(amount) OVER (
                    PARTITION BY invoice ORDER BY date_value ROWS BETWEEN 1 PRECEDING
                            AND 1 PRECEDING
                    )
                ), 0) AS ratio
    FROM table1 t1;
    

    结果:

    INVOICE      DATE_VALUE             YEAR    AMOUNT  RATIO
    -----------------------------------------------------------
    1001         04.11.2015 00:00:00    2015    100     0
    1001         04.11.2016 00:00:00    2016    400     1.22
    1001         04.11.2017 00:00:00    2017    600     1.8250
    1002         01.10.2017 00:00:00    2014    1000    0
    

    DEMO

    【讨论】:

    最近更新 更多