Sql 更新表中的列
我有一个要求,其中有一个如下表Sql 更新表中的列,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我有一个要求,其中有一个如下表 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 Calcula
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;
它因窗口函数错误而失败
有人能帮上忙吗?…如果你想要区别,为什么要使用
mod()
您可能需要一个
coalesce()
来获得0
s,而不是NULL
s(您的查询无法处理此问题,但您的示例数据表明您可能需要这样做)。如果您想要差异,为什么要使用mod()
您可能需要一个
coalesce()
来获得0
s,而不是NULL
s(您的查询无法处理此问题,但您的示例数据表明您可能需要这样做)。正如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/max
以及前面1行和前面1行之间的行,如下所示
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
正如Gordon所指出的,您可以使用滞后
函数和合并
,如下所示,以获得所需的结果
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/max
以及前面1行和前面1行之间的行,如下所示
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
我没有使用coalesce()。你能帮我回答整个问题吗。我使用的是oracle sql developer您可以研究一下这个问题吗?我没有使用coalesce()。你能帮我回答整个问题吗。我正在使用oracle sql developer您可以研究这个问题吗?您可以在这里帮助我回答这个问题吗